对如何处理CORS OPTIONS飞行前要求感到困惑

我刚开始使用跨源资源共享,并试图让我的Web应用程序响应CORS请求。我的webapp是运行在Tomcat 7.0.42上的Spring 3.2应用程序。

在我的Web应用程序的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禁止响应:

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

我不确定如何进行。

Tomcat过滤器默认情况下接受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预检是为了使浏览器确认浏览器应有权访问指定的资源。我理解的意思是,即使在预检过程中也不应调用我的控制器方法。因此,将OPTIONS指定为可接受的方法会适得其反。

Tomcat是否应该在不访问我的代码的情况下直接响应OPTIONS请求?如果是这样,我的配置中是否缺少某些内容?

回答:

我坐下来调试了一下,org.apache.catalina.filters.CorsFilter以找出禁止该请求的原因。希望这可以在将来帮助某人。

根据W3 CORS规范第6.2节“预检请求”,如果提交的任何标头与允许的标头不匹配,则预检必须拒绝该请求。

CorsFilter

的默认配置cors.allowed.headers(与您的情况一样)不包括Authorization与请求一起提交的标头。

我更新了cors.allowed.headers过滤器设置以接受authorization标题,并且预检请求现在已成功。

<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>

当然,我不确定为什么authorization默认情况下,CORS过滤器不允许使用标头。

以上是 对如何处理CORS OPTIONS飞行前要求感到困惑 的全部内容, 来源链接: utcz.com/qa/425929.html

回到顶部