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。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐