注解@CrossOrigin解决跨域问题

阅读正文:

出于安全原因,浏览器禁止AJAX调用驻留在当前源之外的资源。例如,当您在一个选项卡中检查您的银行帐户时,您可以在另一个选项卡上拥有一个Evill站点。来自Evill的脚本无法向您的银行API发出AJAX请求(从您的帐户中提取资金!)使用您的凭据。[en]For security reasons, browsers prohibit Ajax from calling resources that reside outside the current origin. For example, when you check your bank account in one tab, you can have an EVILL site on another tab. Scripts from EVILL cannot make Ajax requests to your bank API (withdraw money from your account! ) use your credentials.

跨源资源共享(CORS)是由大多数浏览器实现的W3C规范,它使您可以灵活地指定授权哪些跨域请求,而不是使用不太安全和不太强大的策略,如IFRAME或JSONP。[en]Cross-source resource sharing (CORS) is a W3C specification implemented by most browsers that gives you the flexibility to specify what cross-domain requests are authorized instead of using less secure and less powerful policies such as IFRAME or JSONP.

一、跨域(CORS)支持:

Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它。所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin

二、使用方法:

1.1、controller方法的CORS配置,您可以向@RequestMapping注解处理程序方法添加一个@CrossOrigin注解,以便启用CORS(默认情况下,@CrossOrigin允许在@RequestMapping注解中指定的所有源和HTTP方法):

@CrossOrigin中有两个参数:[en]Two parameters in @ CrossOrigin:

origins : 允许可访问的域列表

maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。

1.2、为整个controller启用@CrossOrigin

在本例中,为Retrive()和Remove()处理方法启用了跨域支持,您还可以看到如何使用@CrossOrigin属性定制CORS配置。[en]In this example, cross-domain support is enabled for both the retrieve () and remove () processing methods, and you can also see how to customize the CORS configuration using the @ CrossOrigin attribute.

1.3、同时使用controller和方法级别的CORS配置,Spring将合并两个注释属性以创建合并的CORS配置。

1.4、如果您正在使用Spring Security,请确保在Spring安全级别启用CORS,并允许它利用Spring MVC级别定义的配置。

除了细粒度的、基于注释的配置之外,您可能还需要定义一些全局CORS配置。这类似于使用过滤器,但可以声明为Spring MVC并使用细粒度的@CrossOrigin进行配置。默认情况下,允许所有原点以及GET、HEAD和POST方法。[en]In addition to fine-grained, annotation-based configurations, you may also need to define some global CORS configurations. This is similar to using a filter, but can be declared as Spring MVC and configured with fine-grained @ CrossOrigin. By default, all origins and GET, HEAD and POST methods are allowed.

JavaConfig

简化整个应用程序的CORS以:[en]Simplify the CORS of the entire application to:

如果您使用的是Spring Boot,建议您按如下方式声明WebMvcConfigurer Bean:[en]If you are using Spring Boot, it is recommended that you declare WebMvcConfigurer bean as follows:

您可以轻松更改任何属性,并仅将此CORS配置应用于特定路径模式:[en]You can easily change any property and apply only this CORS configuration to a specific path mode:

如果您使用的是Spring Security,请确保在Spring安全级别启用了CORS,并允许它利用在Spring MVC级别定义的配置。[en]If you are using Spring Security, make sure that CORS is enabled at the Spring security level and allow it to take advantage of the configuration defined at the Spring MVC level.

您还可以配置CORS和MVC XML命名空间。[en]You can also configure CORS and MVC XML namespaces.

a、如果整个项目所有方法都可以访问,则可以这样配置;此最小XML配置使CORS在/**路径模式具有与JavaConfig相同的缺省属性:

其中 表示匹配到下一层;** 表示后面不管有多少层,都能匹配。*

可以匹配的路径包括:[en]The paths that can be matched are:

/api/aaa

/api/bbbb

无与伦比的:[en]That cannot be matched:

/api/aaa/bbb

因为*只能匹配到下一层路径。如果您想要匹配,无论您想跟随多少层,配置如下:[en]Because * can only match to the next layer path. If you want to match no matter how many layers you want to follow, the configuration is as follows:

注:事实上,一()变成二()[en]Note: in fact, one () becomes two ()

b、也可以用定制属性声明几个CORS映射:

请求路径的/api/,方法示例如下:[en]Examples of the / api/, method for the request path are as follows:

CORS请求(包括预选的带有选项方法)被自动发送到注册的各种HandlerMapping 。它们处理CORS准备请求并拦截CORS简单和实际请求,这得益于CorsProcessor实现(默认情况下默认DefaultCorsProcessor处理器),以便添加相关的CORS响应头(如Access-Control-Allow-Origin)。 CorsConfiguration 允许您指定CORS请求应该如何处理:允许origins, headers, methods等。

b、子类可以通过重写AbstractHandlerMapping类的getCorsConfiguration(Object, HttpServletRequest)方法来提供自己的CorsConfiguration。

作为上述其他方法的替代,Spring框架还提供了CorsFilter。在这种情况下,不用使用 @CrossOrigin或 WebMvcConfigurer#addCorsMappings(CorsRegistry),,例如,可以在Spring Boot应用程序中声明如下的过滤器:

三、spring注解@CrossOrigin不起作用的原因

1、是springMVC的版本要在4.2或以上版本才支持@CrossOrigin

2、非@CrossOrigin没有解决跨域请求问题,而是不正确的请求导致无法得到预期的响应,导致浏览器端提示跨域问题。

3、在Controller注解上方添加@CrossOrigin注解后,仍然出现跨域问题,解决方案之一就是:

在@RequestMapping注解中没有指定Get、Post方式,具体指定后,问题解决。

类似的代码如下:[en]The similar code is as follows:

四、参考文章:

Original: https://www.cnblogs.com/jpfss/p/12192132.html
Author: 星朝
Title: 注解@CrossOrigin解决跨域问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/6143/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部