Angular客户端请求Rest服务跨域问题的解决方法


Posted in Javascript onSeptember 19, 2017

1.问题描述:通过Origin是http://localhost:4200请求http://localhost:8081的服务,控制台报错如下,但是Response为200。客户端和服务端IP相同,但是端口不同,存在跨域问题。

XMLHttpRequest cannot load http://localhost:8081/api/v1/staffs. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.

2.解决方法:在服务端/api/v1/staffs的Restful方法增加@CrossOrigin注解,比如:

@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping(value = "/api/v1/staffs", produces = { "application/json" }, method = RequestMethod.GET)
RestResponseList<?> queryStaffs(@RequestParam(value = "limit", required = false, defaultValue = "20") int limit,
 @RequestParam(value = "offset", required = false, defaultValue = "0") int offset);

3.重新发送请求http://localhost:8081/api/v1/...,请求成功。且响应头增加了Access-Control-Allow-Credentials和Access-Control-Allow-Origin参数。@CrossOrigin注解即是给响应头增加了这两个参数解决跨域问题。

Angular客户端请求Rest服务跨域问题的解决方法

4.在服务端POST方法同样使用注解@CrossOrigin解决跨域问题。

@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping(value = "/api/v1/staffs", produces = { "application/json" }, method = RequestMethod.POST)
RestResponse<?> createStaff(@RequestBody RestRequest<StaffReqInfo> request);

报错如下:

Angular客户端请求Rest服务跨域问题的解决方法

5.查看响应码415,错误原因:

"status": 415,
"error": "Unsupported Media Type",
"exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
"message": "Content type 'text/plain;charset=UTF-8' not supported"

6.进一步查看请求头信息,content-type为text/plain。与Response Headers的Content-Type:application/json;charset=UTF-8类型不匹配,故报错。

Angular客户端请求Rest服务跨域问题的解决方法

7.指定请求头content-type为application/json,比如在Angular中增加Headers。发送Post请求,请求成功。

let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers });

return this.http.post(this.staffCreateURL, body, options).map((response: Response) => {
 //return this.http.get(this.userLoginURL).map((response:Response)=> {
 let responseInfo = response.json();
 console.log("====请求staffCreateURL成功并返回数据start===");
 console.log(responseInfo);
 console.log("====请求staffCreateURL成功并返回数据end===");
 let staffName = responseInfo.responseInfo.staffName;
 console.log(staffName);
 return responseInfo;
})

另:也可以在HttpServletResponse对象通过setHeader("Access-Control-Allow-Origin", "*")方法增加响应头参数,解决跨域问题,即是@CrossOrigin注解方式。推荐使用注解,方便。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用dtree实现树形菜单 dtree使用说明
Oct 17 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
jquery mobile事件多次绑定示例代码
Sep 13 Javascript
判断客户浏览器是否支持cookie的示例代码
Dec 23 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
Oct 10 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
Dec 18 Javascript
Bootstrap编写导航栏和登陆框
May 30 Javascript
JavaScript中的冒泡排序法
Aug 03 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
es6中比较有用的7个技巧小结
Jul 12 Javascript
vue实现数据控制视图的原理解析
Jan 07 Javascript
jQuery实现可兼容IE6的遮罩功能详解
Sep 19 #jQuery
jQuery选择器之表单元素选择器详解
Sep 19 #jQuery
JS实现静态页面搜索并高亮显示功能完整示例
Sep 19 #Javascript
原生javascript实现的全屏滚动功能示例
Sep 19 #Javascript
Vue结合SignalR实现前后端实时消息同步
Sep 19 #Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
Sep 19 #Javascript
vue实现页面加载动画效果
Sep 19 #Javascript
You might like
PHP基础知识介绍
2013/09/17 PHP
php格式化日期实例分析
2014/11/12 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
通过正则表达式获取url中参数的简单实现
2016/06/07 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
详细解析Python中的变量的数据类型
2015/05/13 Python
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
python实现矩阵打印
2019/03/02 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
python动态进度条的实现代码
2019/07/03 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
六年级数学教学反思
2014/02/03 职场文书
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
岗位廉政承诺书
2014/03/27 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
2015年度党员个人总结
2015/02/14 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL
python 镜像环境搭建总结
2022/09/23 Python