项目中使用swagger工具对odata接口进行api测试时,发现报跨域问题。
一 .报错:
报错如下:
查看浏览器请求:
响应信息:
二.错误分析
- 第一个错误:
浏览器发送OPTIONS请求 ,为什么会发送OPTIONS请求呢?
什么是CORS跨域请求的简单请求和非简单请求
- 简单请求:
必须为post、get、head请求
header头只能包含:无自定义头部字段、Accept、Accept-Language、Content-Language、Last-Event-ID、Content- Type(只有三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)
- 复杂请求:
请求方式:PUT、DELETE
自定义头部字段
发送json格式数据
当发送非简单请求时,正式通信之前,浏览器会先发送OPTION请求,进行预检,这一次的请求称为“预检请求”
服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据。
图中的报错信息,去查看访问odata接口的源码,发现odata请求只支持以下几种方法(总归就是后台应用不支持 OPTIONS请求):
解决办法:
设置完报错:
大概意思就是:在响应头Access-Control-Allow-Headers 中存在不能访问的字段信息authorization。
解决方法,Access-Control-Allow-Headers
中添加 Authorization
:
总结:
在servlet中设置跨域的方法:
/* 允许跨域的主机地址 */
response.setHeader("Access-Control-Allow-Origin", "*");
/* 允许跨域的请求方法GET, POST, HEAD 等 */
response.setHeader("Access-Control-Allow-Methods", "*");
/* 重新预检验跨域的缓存时间 (s) */
response.setHeader("Access-Control-Max-Age", "3600");
/* 允许跨域的请求头 */
response.setHeader("Access-Control-Allow-Headers", "*");
/* 是否携带cookie */
response.setHeader("Access-Control-Allow-Credentials", "true");
/*还需要设置允许OPTIONS请求*/if ("OPTIONS".equals(req.getMethod())) {
resp.setStatus(HttpStatus.SC_OK);
}
解决!!!
参考:
https://www.iteye.com/blog/finishx-2345381
https://www.cnblogs.com/caimuqing/p/6733405.html
https://www.jianshu.com/p/8612ef7b8543
https://www.jianshu.com/p/ebd498cc3c52