Java | Configuración de Spring Boot / Nginx para resolver problemas entre dominios en proyectos de separación de front-end y back-end

1. Soporte CORS basado en filtros (proyecto Spring Boot)

El marco de Spring también proporciona CorsFilter. En este caso, no use @CrossOrigino WebMvcConfigurer#addCorsMappings(CorsRegistry), por ejemplo, puede declarar el siguiente filtro en la aplicación 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);
    }
}

Dos, forma Nginx

1. Descarga Nginx (se recomienda 1.18.0)

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

2. Configurar Nginx, editar nginx-1.18.0\conf\nginx.conf

Comentar la configuración predeterminada del servidor

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

El código anterior significa localhost:80reenviar 192.168.0.76:8005, es decir, la visita es en localhost:80realidad una visita 192.168.0.76:8005y la visita localhost:80/ssns-servees una visita localhost:8080y ssns-servecomienza con una URL.

3. Compatibilidad con varios dominios (CORS):

Spring Framework 4.2 GA proporciona soporte de primera clase para CORS, lo que hace que sea más fácil y más poderoso configurarlo que las soluciones habituales basadas en filtros. Entonces, la versión de springMVC debe ser 4.2 o superior para admitir @CrossOrigin

1. El controlador configura CORS

1.1. Configuración CORS del método del controlador, puede agregar una anotación @CrossOrigin al método del controlador de anotaciones @RequestMapping para habilitar CORS (de forma predeterminada, @CrossOrigin permite todas las fuentes y métodos HTTP especificados en la anotación @RequestMapping)

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

Entre ellos se encuentran los 2 parámetros en @CrossOrigin:
origins : la lista de dominios a los que se permite acceder
maxAge : el tiempo máximo (en segundos) que dura la caché antes de preparar una respuesta

1.2. Habilite @CrossOrigin para todo el controlador

@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. Usando la configuración de CORS de nivel de método y de controlador, Spring fusionará los dos atributos de anotación para crear una configuración de CORS combinada

@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. Si está utilizando Spring Security, asegúrese de habilitar CORS en el nivel de seguridad Spring y permita que aproveche la configuración definida en el nivel Spring MVC

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

2. Configuración de CORS global

Además de la configuración detallada basada en anotaciones, es posible que también deba definir algunas configuraciones CORS globales. Esto es similar al uso de filtros, pero puede declararse como Spring MVC y combinarse con una configuración detallada de @CrossOrigin. De forma predeterminada, se permiten todos los orígenes y métodos GET, HEAD y POST

JavaConfig
simplifica el CORS de toda la aplicación para:

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

Si está utilizando Spring Boot, se recomienda declarar el bean WebMvcConfigurer de la siguiente manera:

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

Puede cambiar fácilmente cualquier atributo y aplicar esta configuración CORS solo a patrones de ruta específicos:

@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);
}

Si está utilizando Spring Security, asegúrese de habilitar CORS en el nivel de seguridad Spring y permita que aproveche la configuración definida en el nivel Spring MVC

PD: La razón por la que la anotación Spring @CrossOrigin no funciona

1. La versión de springMVC debe ser 4.2 o superior para admitir @CrossOrigin
2. Non- @ CrossOrigin no resuelve el problema de la solicitud entre dominios, pero las solicitudes incorrectas dan como resultado que no se obtenga la respuesta esperada, lo que hace que el navegador genere problemas entre dominios
3 , Después de agregar la anotación @CrossOrigin encima de la anotación del Controlador, todavía ocurren problemas entre dominios. Una de las soluciones es:
los métodos Get y Post no se especifican en la anotación @RequestMapping. Después de la designación específica, el problema se resuelve

el código se muestra a continuación:

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

Supongo que te gusta

Origin blog.csdn.net/y1534414425/article/details/107837630
Recomendado
Clasificación