ajax跨域-ContentType为application/json-以及security-constraint安全约束标签
ajax跨域-ContentType为application/json-以及security-constraint安全约束标签ContentType:application/json的特殊点Preflight 403options小意外ContentType:application/json的特殊点前台使用ajax,如果在调用后台接口中设置contentType: “application/jso
ajax跨域-ContentType为application/json-以及security-constraint安全约束标签
出现跨域
现象前台ajax调用后台接口,出现跨域报错,在浏览器控制台打印打印信息“Response to preflight request doesn’t pass access control check”,即预请求不通过。
但是后台过滤器没有收到请求,怀疑请求没有到后台。
通过浏览器控制台查看到在network中发送了两次请求,
查询一次调用,发送两次请求,得到以下情况会有两次请求:
有三种方式会导致这种现象:
1、请求方法不是GET/HEAD/POST
2、POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
3、请求设置了自定义的header字段
ajax中Content-Type使用了application/json。
ContentType:application/json的特殊点
前台使用ajax,如果在调用后台接口中设置contentType: “application/json;charset=utf-8”,发送了两次请求,了解到第一次请求查询后台允许的请求类型,然后在再发送具体的业务请求,第一次请求类似于预检,“ajax的ContentType为application/json请求失败的问题”详见:https://blog.csdn.net/weixin_33860147/article/details/86254851。
虽然去掉contentType: “application/json;charset=utf-8”,请求可以进入过滤器,但是接口中需要application/json格式的数据。
还需要继续研究。
Preflight 403
既然必须使用application/json,那就需要了解下第一次请求的特殊之处。
比较好奇为什么使用application/json后,调用接口时没有进入过滤器,应该是第一次请求出现问题,第一次请求返回403
查了下“Preflight 403”,了解了,第一次发送options类型请求的作用,详见https://www.656463.com/wenda/jinzhiyujian403dexiangying_133
403进行禁止预检403的响应(Response for preflight 403 forbidden)
没有进入后台请求,应该是options类型的请求在过滤器前就被处理了。
options
又在代码中搜索了下“options”,
看到web.xml文件中,标签内有个“options”的处理,有个安全约束,于是去掉里面配置的options。
开始没有走后台的过滤器应该就是因为先执行了标签,将不安全的HTTP请求处理掉了。
详见:https://blog.csdn.net/u012045045/article/details/86612561。
OK。
处理
1)Web.xml文件的标签中去掉里面配置的options
2)在过滤器中允许options类型的请求,并设置允许跨域
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader(“Access-Control-Allow-Origin”, “");
response.setHeader(“Access-Control-Allow-Methods”, “POST, GET, OPTIONS, DELETE”);
response.setHeader(“Access-Control-Max-Age”, “3600”);
response.setHeader(“Access-Control-Allow-Headers”, "”);
小意外
在处理web.xml的时候遇到个小意外,代码没有编译,clean后编译才OK。
更多推荐
所有评论(0)