SpringMVC-CROS:使用Chrome无法跨域使用PUT和DELETE请求

基础环境:SpringMVC4.2.1,使用<mvc:cors>进行跨域配置

<!-- 跨域设置 -->
<mvc:cors>
<mvc:mapping path="/mobile/**"
allowed-origins="*"
allowed-methods="GET, PUT, DELETE, POST, OPTIONS"
allowed-headers="*"
exposed-headers=""
allow-credentials="false"
max-age="60" />
<!--
Allow-Methods: 真实请求允许的方法
Allow-Headers: 服务器允许使用的字段
Allow-Credentials: 是否允许用户发送、处理 cookie
Max-Age: 预检请求的有效期,单位为秒。有效期内,不会重复发送预检请求
-->
</mvc:cors>

现象:使用IE和Firefox均可以正常响应PUT和DELETE的OPTIONS预检请求,但是使用Chrome时被拒绝。

原因:在Chrome的52版本以后,浏览器处理Access-Control-Request-Headers有Bug,如果不设置的话,Chrome会提交一个空字符串,导致Spring的CROS拒绝请求,所以在发送请求前设置一个header

解决办法:

$.ajax({
  type : "PUT",
  url : url+"put",
  data : {},
  dataType : 'json',
  async : true,
  beforeSend: function(xhr){
    xhr.setRequestHeader("X-THOR");
    //在Chrome的52版本以后,浏览器处理Access-Control-Request-Headers有Bug,如果不设置的话,Chrome会提交一个空字符串,导致Spring的CROS拒绝请求,所以在发送请求前设置一个header
  },
  error : function(reques, textStatus, errorThrown){
    alert(textStatus+":"+errorThrown);
  },
  success : function(result){
    alert(result.success);
  }
});

 

posted on 2017-07-26 15:13  神秘之光  阅读(886)  评论(0)    收藏  举报

导航