Java | Spring Boot配置/Nginx 解决前后端分离项目中跨域问题

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

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

package com.card.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * 跨域访问控制
 */
@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 允许任何域名使用
        corsConfiguration.addAllowedOrigin("*");
        // 允许任何头
        corsConfiguration.addAllowedHeader("*");
        // 允许任何方法(post、get等)
        corsConfiguration.addAllowedMethod("*");
        return corsConfiguration;
    }


    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对接口配置跨域设置
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
}

二、Nginx方式

1.下载Nginx(推荐1.18.0)

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

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

把默认的server配置注释掉

server{
        listen 80;
        server_name  localhost;
 
        location /{
            proxy_pass http://192.168.0.76:8005/;
        }
 
        location /ssns-serve{
            proxy_pass http://localhost:8080;
        }
    }

上面代码的意思是将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方法)

@RestController
@RequestMapping("/account") 
public class AccountController {
    @CrossOrigin
    @GetMapping("/{id}") 
    public Account retrieve(@PathVariable Long id) { // ...
 }
    @DeleteMapping("/{id}") 
    public void remove(@PathVariable Long id) { // ...
 }
}

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

1.2.为整个controller启用@CrossOrigin

@CrossOrigin(origins = "http://baidu.com", maxAge = 3600)
@RestController
@RequestMapping("/account") 
public class AccountController {
    @GetMapping("/{id}") 
    public Account retrieve(@PathVariable Long id) { // ...
 }
    @DeleteMapping("/{id}") 
    public void remove(@PathVariable Long id) { // ...
 }
}

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

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account") 
public class AccountController {
    @CrossOrigin(origins = "http://baidu.com")
    @GetMapping("/{id}") 
    public Account retrieve(@PathVariable Long id) { // ...
 }
    @DeleteMapping("/{id}") 
    public void remove(@PathVariable Long id) { // ...
 }
}

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

@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override 
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()...
    }
}

2、全局CORS配置

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

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

@Configuration
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override 
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

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

@Configuration 
public class MyConfiguration {
    @Bean 
    public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() {
            @Override 
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

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

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

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

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

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

代码如下:

@CrossOrigin
@RestController 
public class person{
    @RequestMapping(method = RequestMethod.GET) 
    public String add() { // ...
 }
}

你可能感兴趣的:(Java,Spring)