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 相关文章推荐
javascript 同时在IE和FireFox获取KeyCode的代码
Feb 07 Javascript
Jquery+WebService 校验账号是否已被注册的代码
Jul 12 Javascript
js 分页全选或反选标识实现代码
Aug 09 Javascript
详解Angular开发中的登陆与身份验证
Jul 27 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
Sep 12 Javascript
AngularJS删除路由中的#符号的方法
Sep 20 Javascript
jquery实现页面加载效果
Feb 21 Javascript
JavaScript运动框架 链式运动到完美运动(五)
May 18 Javascript
详解在AngularJS的controller外部直接获取$scope
Jun 02 Javascript
tween.js缓动补间动画算法示例
Feb 13 Javascript
你了解vue3.0响应式数据怎么实现吗
Jun 07 Javascript
vue指令v-html使用过滤器filters功能实例
Oct 25 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
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
laravel入门知识点整理
2020/09/15 PHP
ScrollDown的基本操作示例
2013/06/09 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python动态网页批量爬取
2016/02/14 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
详解django自定义中间件处理
2018/11/21 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
python安装pil库方法及代码
2019/06/25 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
院药学专业个人求职信
2013/09/21 职场文书
法律工作求职自荐信
2013/10/31 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
酒店辞职书范文
2015/02/26 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
感恩教育观后感
2015/06/17 职场文书
Mysql数据库group by原理详解
2022/07/07 MySQL