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 相关文章推荐
doctype后如何获得body.clientHeight的方法
Jul 11 Javascript
javascript常见数据验证插件大全
Aug 03 Javascript
判断输入的字符串是否是日期格式的简单方法
Jul 11 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
Dec 04 Javascript
深入解析js轮播插件核心代码的实现过程
Apr 14 Javascript
vue params、query传参使用详解
Sep 12 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
Dec 26 Javascript
vue+element模态框中新增模态框和删除功能
Jun 11 Javascript
vue中使用rem布局代码详解
Oct 30 Javascript
微信小程序canvas开发水果老虎机的思路详解
Feb 07 Javascript
ant design 日期格式化的实现
Oct 27 Javascript
javascript实现点击小图显示大图
Nov 29 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的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
js一组验证函数
2008/12/20 Javascript
jQuery 使用手册(六)
2009/09/23 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
2009/11/11 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
jQuery代码优化 遍历篇
2011/11/01 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
python 上下文管理器使用方法小结
2017/10/10 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
前厅收银主管岗位职责
2014/02/04 职场文书
学生操行评语大全
2014/04/24 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
客户经理岗位职责大全
2015/04/09 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
六年级情感作文之500字
2019/10/23 职场文书
Python函数中apply、map、applymap的区别
2021/11/27 Python
vue修饰符.capture和.self的区别
2022/04/22 Vue.js