对如何处理 CORS OPTIONS 预检请求感到困惑

2024-01-06

我是跨源资源共享的新手,并试图让我的网络应用程序响应 CORS 请求。我的 web 应用程序是在 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 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

我不完全确定如何继续。默认情况下 Tomcat 过滤器 https://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter,接受 OPTIONS 标头来访问资源。

我认为问题在于我的资源(请求 URL)http://dev.mydomain.com/joeV2/users/listUsers 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 指定为可接受的方法会适得其反。

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


我坐下来调试org.apache.catalina.filters.CorsFilter找出为什么该请求被禁止。希望这可以帮助将来的人。

根据W3 CORS 规范第 6.2 节预检请求 http://www.w3.org/TR/cors/#resource-preflight-requests,如果提交的任何标头与允许的标头不匹配,则预检必须拒绝请求。

The CorsFilter 的默认配置 https://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter 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 过滤器不允许标头。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对如何处理 CORS OPTIONS 预检请求感到困惑 的相关文章

随机推荐

  • 在 JPA 中获取数据库架构名称(来自 EntityManager/EntityManagerFactory)[重复]

    这个问题在这里已经有答案了 在 JPA EclipseLink 2 4 中 我需要在 NativeQuery 中指定模式名称 EntityManager em emf createEntityManager Query query em c
  • ORA-01461: 只能绑定 LONG 值以插入 LONG 列 - 查询时发生

    当我尝试查询对象时 最终出现以下错误 ORA 01461 can bind a LONG value only for insert into a LONG column 有人可以帮我解决问题的原因和解决方案吗 varchar2 列也可能发
  • 如何在引用变量之前测试它是否已定义?

    我希望能够在访问变量之前测试变量是否已定义 我喜欢有一个指定 调试级别 的全局变量 如果调试级别为 0 则不会给出额外的输出 当大于 1 时 将给出调试输出 数字越大 输出越详细 我还想对其进行设置 以便程序能够运行 并假定级别为 0 如果
  • 如何以编程方式获取我的 LinkShare 商家域列表

    我想知道是否有一个 API 可以用来获取 LinkShare 商家域 URL 商户搜索端点仅返回他们的uid and name 根据 Linkshare 帮助文档 您可以获取程序中所有广告商的默认 URL 列表 通过连接两个 API 中的数
  • 单击外部时响应关闭模式

    我已经使用 React 创建了一个基本模态 没有任何库 它工作得很好 现在当我单击模态之外时 我想关闭模态 这里是实时预览 我的index js import React from react import ReactDOM from re
  • 实时更新标记

    我需要从 json 文件中获取新位置 该文 件将定期更新 以便在地图上更新它 而无需重复重新加载整个页面 不使用Ajax怎么办 if GBrowserIsCompatible add controls var map new GMap do
  • 自定义 CSS 属性是否使用一个或两个前导破折号?

    elem myCustom 99 OR elem myCustom 99 我在网上的示例中看到了以上两种用法 两者有什么区别 尝试访问 JavaScript 中的自定义属性返回 null elem myCustom 99 div some
  • AutoMapper 将源对象上的单个列表映射到目标对象上的两个列表

    我正在尝试使用 AutoMapper 从包含对象列表的域对象进行映射 其中我有一个布尔属性 我想使用 AutoMapper 用来将该列表拆分为目标对象上的两个目标的属性 我的基本域如下所示 来源 Domain object public c
  • 在文件名的扩展名之前插入字符串

    如何在图像文件名的扩展名之前插入字符串 例如 我需要转换这个 Course Assess Responsive Course 1 1 png to this Course Assess Responsive Course 1 1 large
  • 如何测量 scons 构建的每个组件的构建时间?

    我有一个使用 scons 构建的大型 C 项目 它的构建速度很慢 我想进行一些更改以使其构建速度更快 现在我想集中时间加速构建中最慢的部分 如何找出哪些文件的编译时间最长 我知道这个问题很旧 并且已经被接受 但最近从另一个问题中引用了它 我
  • 内联对齐 3 个 div

    我正在尝试将 3 个 div 彼此内联对齐 i have header width 100 height 160px 作为主容器 因此容器适合页面的宽度 100 then header left width 33 display inlin
  • 在SSIS数据流中动态创建表

    如何让 SSIS 数据流创建一个不存在的表 每次我尝试运行该包时 都会出现错误 指出目标表不存在 由于您希望包创建一个表然后填充它 因此您可以使用以下命令创建一个表 Execute SQL任务 只需为其提供创建表的脚本即可 如果您无法选择使
  • 检查Python中的整数溢出

    class Solution object def reverse self x type x int rtype int negative False if x lt 0 x x 1 negative True else x x sum
  • T --> IHandler 之间的映射

    我有以下界面 public interface IHandler
  • 如何获取管道另一端的pid?

    我想知道管道另一端的pid 如果是 Linux 我可以匹配 idls l proc SELF PID fd 0就像这些命令一样 root host command1 command2 I ve known command2 s PID 59
  • 如何删除 django 中的数据库表?

    我改变了模型并进行了迁移 然后我又更改了一次模型 当尝试 python manage py migrate 时出现错误 Operations to perform Apply all migrations admin auth conten
  • 404 - 请求的资源不可用。 (Spring-MVC)

    我对 Spring MVC 视图解析器不太熟悉 我试图从我的控制器返回一个 JSP 我的控制器方法正在正确执行 但是当返回视图时 我得到404 The requested resource is not available error 这是
  • Javascript / Nodejs 在 Nodejs 模块的顶层使用等待

    我尝试找到问题的解决方案 但找不到它 并且正在寻找一些 最佳实践示例 我有一个 Nodejs Express 应用程序 我的函数被分割在文件中 例如我有这个控制器 oktacontroller js var okta api key
  • IE 和 Firefox 中的按钮大小不相等

    我的 jsp 页面上有几个按钮 我使用的样式为 buttonblue background color 003366 border color 99CCFF color FFFFFF font family Verdana Arial He
  • 对如何处理 CORS OPTIONS 预检请求感到困惑

    我是跨源资源共享的新手 并试图让我的网络应用程序响应 CORS 请求 我的 web 应用程序是在 Tomcat 7 0 42 上运行的 Spring 3 2 应用程序 在我的 web 应用程序的 web xml 中 我启用了 Tomcat