加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 对如何处理CORS OPTIONS预检要求感到困惑

发布时间:2020-12-17 08:20:07 所属栏目:安全 来源:网络整理
导读:我很喜欢使用Cross Origin资源共享,并试图让我的webapp响应CORS请求。我的webapp是在Tomcat 7.0.42上运行的Spring 3.2应用程序。 在我的webapp的web.xml中,我启用了Tomcat CORS过滤器: !-- Enable CORS (cross origin resource sharing) --!-- http://tom
我很喜欢使用Cross Origin资源共享,并试图让我的webapp响应CORS请求。我的webapp是在Tomcat 7.0.42上运行的Spring 3.2应用程序。

在我的webapp的web.xml中,我启用了Tomcat CORS过滤器:

<!-- Enable CORS (cross origin resource sharing) -->
<!-- http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter -->
<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

我的客户端(用AngularJS 1.2.12编写)试图访问启用了基本身份验证的REST端点。当它成为GET请求时,Chrome首先对请求进行预检,但是正在从服务器接收到403 Forbidden响应:

Request URL:http://dev.mydomain.com/joeV2/users/listUsers
Request Method:OPTIONS
Status Code:403 Forbidden
Request Headers:
   OPTIONS /joeV2/users/listUsers HTTP/1.1
   Host: dev.mydomain.com
   Connection: keep-alive
   Cache-Control: max-age=0
   Access-Control-Request-Method: GET
   Origin: http://localhost:8000
   User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/32.0.1700.107 Safari/537.36
   Access-Control-Request-Headers: accept,authorization
   Accept: */*
   Referer: http://localhost:8000/
   Accept-Encoding: gzip,deflate,sdch
   Accept-Language: en-US,en;q=0.8
Response Headers:
   HTTP/1.1 403 Forbidden
   Date: Sat,15 Feb 2014 02:16:05 GMT
   Content-Type: text/plain; charset=UTF-8
   Content-Length: 0
   Connection: close

我不完全确定如何进行。 The Tomcat filter,by default,接受OPTIONS头来访问资源。

我相信这个问题是我的资源(请求URL)http://dev.mydomain.com/joeV2/users/listUsers被配置为仅接受GET方法:

@RequestMapping( method=RequestMethod.GET,value="listUsers",produces=MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<User> list(){
    return userService.findAllUsers();
}

这是否意味着我必须使该方法/端点接受OPTIONS方法?如果是这样,这是否意味着我必须明确地使每个REST端点接受OPTIONS方法?除了杂乱的代码,我很困惑,甚至会如何工作。从我所了解的OPTIONS preflight是为浏览器验证浏览器应该访问指定的资源。我明白的是,我的控制器方法在预检中不应该被调用。因此,将OPTIONS指定为可接受的方法将会产生反效果。

Tomcat应该直接响应OPTIONS请求,甚至无法访问我的代码?如果是这样,我的配置中是否有东西丢失?

我坐下来调试,通过org.apache.catalina.filters.CorsFilter来弄清楚为什么这个请求是被禁止的。希望这可以帮助一个人在未来。

根据W3 CORS Spec Section 6.2 Preflight Requests,如果提交的标题与允许的标题不符,则预检必须拒绝该请求。

default configuration for the CorsFilter cors.allowed.headers(as yours)不包含与请求一起提交的授权头。

我更新了cors.allowed.headers过滤器设置以接受授权头,并且预检要求现在已成功。

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization</param-value>
    </init-param>     
</filter>

当然,我不知道为什么CORS过滤器不允许默认的授权头。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读