ajax跨域-ContentType为application/json-以及security-constraint安全约束标签

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值