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 相关文章推荐
jquery 上下滚动广告
Jun 17 Javascript
为指定元素增加样式的js代码
Dec 09 Javascript
jquery插件制作 手风琴Panel效果实现
Aug 17 Javascript
JS清除IE浏览器缓存的方法
Jul 26 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
Apr 23 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
Oct 30 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
Dec 04 Javascript
JS基于面向对象实现的选项卡效果示例
Dec 20 Javascript
用React实现一个完整的TodoList的示例代码
Oct 30 Javascript
vue下载excel的实现代码后台用post方法
May 10 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
Sep 11 Javascript
vue在线动态切换主题色方案
Mar 26 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
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
2015/05/12 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
python:socket传输大文件示例
2017/01/18 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
对python的输出和输出格式详解
2018/12/08 Python
python 实用工具状态机transitions
2020/11/21 Python
使用HTML5原生对话框元素并轻松创建模态框组件
2019/03/06 HTML / CSS
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
药学专业个人自我评价
2013/11/11 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
小学防溺水制度
2014/01/29 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书