crossorigin注解添加了解决不了跨域问题_前后端分离跨域终极解决方案,这一篇就够了...

一、基于过滤器的CORS支持(Spring Boot项目)

Spring框架还提供了CorsFilter。在这种情况下,不用使用@CrossOriginWebMvcConfigurer#addCorsMappings(CorsRegistry),例如,可以在Spring Boot应用程序中声明如下的过滤器:

 1package com.card.config;
2
3import org.springframework.context.annotation.Bean;
4import org.springframework.context.annotation.Configuration;
5import org.springframework.web.cors.CorsConfiguration;
6import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
7import org.springframework.web.filter.CorsFilter;
8
9/**10 * 跨域访问控制11 */
12@Configuration
13public class CorsConfig {
14    private CorsConfiguration buildConfig() {
15        CorsConfiguration corsConfiguration = new CorsConfiguration();
16        // 允许任何域名使用
17        corsConfiguration.addAllowedOrigin("*");
18        // 允许任何头
19        corsConfiguration.addAllowedHeader("*");
20        // 允许任何方法(post、get等)
21        corsConfiguration.addAllowedMethod("*");
22        return corsConfiguration;
23    }
24
25
26    @Bean
27    public CorsFilter corsFilter() {
28        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
29        // 对接口配置跨域设置
30        source.registerCorsConfiguration("/**", buildConfig());
31        return new CorsFilter(source);
32    }
33}

二、Nginx方式

1.下载Nginx(推荐1.18.0)

1https://nginx.org/en/download.html

2.配置Nginx,编辑 nginx-1.18.0\conf\nginx.conf

把默认的server配置注释掉

 1server{
2        listen 80;
3        server_name  localhost;
4
5        location /{
6            proxy_pass http://192.168.0.76:8005/;
7        }
8
9        location /ssns-serve{
10            proxy_pass http://localhost:8080;
11        }
12    }

上面代码的意思是将localhost:80转发为192.168.0.76:8005,也就是说现在访问localhost:80实际上是访问192.168.0.76:8005,而访问localhost:80/ssns-serve则是访问localhost:8080,并以ssns-serve开头的url

三、跨域(CORS)支持:

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

1、controller配置CORS

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

 1@RestController
2@RequestMapping("/account") 
3public class AccountController {
4    @CrossOrigin
5    @GetMapping("/{id}") 
6    public Account retrieve(@PathVariable Long id) { // ...
7 }
8    @DeleteMapping("/{id}") 
9    public void remove(@PathVariable Long id) { // ...
10 }
11}

其中@CrossOrigin中的2个参数:origins:允许可访问的域列表maxAge:准备响应前的缓存持续的最大时间(以秒为单位)

1.2.为整个controller启用@CrossOrigin

 1@CrossOrigin(origins = "http://baidu.com", maxAge = 3600)
2@RestController
3@RequestMapping("/account") 
4public class AccountController {
5    @GetMapping("/{id}") 
6    public Account retrieve(@PathVariable Long id) { // ...
7 }
8    @DeleteMapping("/{id}") 
9    public void remove(@PathVariable Long id) { // ...
10 }
11}

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

 1@CrossOrigin(maxAge = 3600)
2@RestController
3@RequestMapping("/account") 
4public class AccountController {
5    @CrossOrigin(origins = "http://baidu.com")
6    @GetMapping("/{id}") 
7    public Account retrieve(@PathVariable Long id) { // ...
8 }
9    @DeleteMapping("/{id}") 
10    public void remove(@PathVariable Long id) { // ...
11 }
12}

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

1@EnableWebSecurity 
2public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
3    @Override 
4    protected void configure(HttpSecurity http) throws Exception {
5        http.cors().and()...
6    }
7}

2、全局CORS配置

除了细粒度、基于注释的配置之外,您还可能需要定义一些全局CORS配置。这类似于使用筛选器,但可以声明为Spring MVC并结合细粒度@CrossOrigin配置。默认情况下,所有origins and GET, HEAD and POST methods是允许的

JavaConfig
使整个应用程序的CORS简化为:

1@Configuration
2@EnableWebMvc 
3public class WebConfig extends WebMvcConfigurerAdapter {
4    @Override 
5    public void addCorsMappings(CorsRegistry registry) {
6        registry.addMapping("/**");
7    }
8}

如果您正在使用Spring Boot,建议将WebMvcConfigurer bean声明如下:

 1@Configuration 
2public class MyConfiguration {
3    @Bean 
4    public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() {
5            @Override 
6            public void addCorsMappings(CorsRegistry registry) {
7                registry.addMapping("/**");
8            }
9        };
10    }
11}

您可以轻松地更改任何属性,以及仅将此CORS配置应用到特定的路径模式:

1@Override 
2public void addCorsMappings(CorsRegistry registry) {
3    registry.addMapping("/api/**")
4        .allowedOrigins("http://baidu.com")
5        .allowedMethods("PUT", "DELETE")
6            .allowedHeaders("header1", "header2", "header3")
7        .exposedHeaders("header1", "header2")
8        .allowCredentials(false).maxAge(3600);
9}

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

PS:Spring注解@CrossOrigin不起作用的原因

1、是springMVC的版本要在4.2或以上版本才支持@CrossOrigin
2、非@CrossOrigin没有解决跨域请求问题,而是不正确的请求导致无法得到预期的响应,导致浏览器端提示跨域问题
3、在Controller注解上方添加@CrossOrigin注解后,仍然出现跨域问题,解决方案之一就是:
在@RequestMapping注解中没有指定Get、Post方式,具体指定后,问题解决

代码如下:

1@CrossOrigin
2@RestController 
3public class person{
4    @RequestMapping(method = RequestMethod.GET) 
5    public String add() { // ...
6 }
7}

faea2218a42b5a38ec9d61f17a1ae542.png

微信公众号科技猫回复数字:228 获取精选Java面试题

这里是科技猫,我们下期见!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值