SpringMvc CORS跨域设置

SpringMvc CORS跨域设置,第1张

基于安全的考虑, W3C 规范规定浏览器禁止访问不同域(origin)的资源,目前绝大部分浏览器遵循这一规范,从而衍生出了跨域资源共享 ( CORS )问题,相比于 IFRAME 或 JSONP , CORS 更全面并且更安全, Spring Mvc 为我们提供了一套多粒度的CORS解决方案。

关于 CORS 的介绍,主要参考文章 《Cross-Origin Resource Sharing (CORS)》

CORS 的工作原理是添加新的 HTTP headers 来让服务器描述哪些源的请求可以访问该资源,对于可能对服务器造成不好影响的请求,规范规定浏览器需要先发送“预检”请求(也就是 OPTION 请求),在预检请求通过后再发送实际的请求,服务器还可以通知客户端是否应该随请求发送“凭据”(例如 Cookie 和 HTTP 身份验证),更详细的介绍可以参考上面的文章,本文主要讨论 Spring Mvc 对 CORS 的支持。

需要注意的是:

不需要发送”预检“请求

可以看见 @CrossOrigin 注解可以标注在类或者方法上,其中几个常量如 DEFAULT_ORIGINS 已经在Spring 5.0弃用,取而代之的是 CorsConfiguration#applyPermitDefaultValues 方法。

标注在类上,该类的所有方法均会生效

同时也可以类和方法结合使用

@CrossOrigin 注解比较适用于较细粒度的跨域控制,对于全局的跨域控制, Spring Mvc 提供了 Global Configuration 配置。

Spring Mvc 对于全局的 CORS 比较简单,分为两个方案

创建 WebConfig 类实现 WebMvcConfigurer 接口,通过 CorsRegistry 设置跨域信息

通过 CorsConfiguration 设置跨域信息,并将 CorsConfiguration 通过 CorsFilter 构造函数传递进去

Spring Mvc 对于 CORS 可以说是非常方便,本文主要是想让各位开发者对跨域有个整体的了解,各个参数代表的含义,而不是在所有项目中都一概而论的设置为“*”,要在自身项目的实际需求以及安全性上多做思考,防止生产事故。

1、CORS的原理:CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。

2、tomcat如何配置cors的跨域请求: 

在tomcat中,有一个和cors相关的拦截器:CORS Filter

该过滤器可以通过添加必需的访问控制请求头Access-Control-*对象来进行跨域。同时还可以对一些请求进行拦截。如果请求是无效的,或者是不被允许的,该请求被拒绝或者禁止。 

其在web.xml文件中的基本配置如下:

<filter>

        <filter-name>CorsFilter</filter-name>

        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>

        <init-param>

            <param-name>cors.allowed.origins</param-name>

            <param-value>

                ,

                

            </param-value>

        </init-param>

        <init-param>

            <param-name>cors.allowed.methods</param-name>

            <param-value>

                GET,POST,HEAD,OPTIONS,PUT

            </param-value>

        </init-param>

        <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,Access-Control-Allow-Origin

            </param-value>

        </init-param>

        <init-param>

            <param-name>cors.exposed.headers</param-name>

            <param-value>

                Access-Control-Allow-Origin,Access-Control-Allow-Credentials

            </param-value>

        </init-param>

        <init-param>

            <param-name>cors.support.credentials</param-name>

            <param-value>true</param-value>

        </init-param>

        <init-param>

            <param-name>cors.preflight.maxage</param-name>

            <param-value>10</param-value>

        </init-param>

    </filter>

    <filter-mapping>

        <filter-name>CorsFilter</filter-name>

        <url-pattern>/wxrefund/*</url-pattern>

    </filter-mapping>

3、cors.allowed.origins:允许访问资源的源列表。*表示任何来源都可以访问该资源。否则,只有配置的白名单的来源可以访问该资源,其中白名单用逗号隔开,如,。

4、cors.allowed.methods:允许访问的http请求方法,如GET,POST,HEAD,OPTIONS,PUT等,方法名用逗号隔开。

5、cors.allowed.headers:在实际请求时可使用的请求头列表,用逗号隔开。如Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Access-Control-Allow-Origin。这些头也将返回作为访问控制的一部分。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11905597.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存