1. Soporte CORS basado en filtros (proyecto Spring Boot)
El marco de Spring también proporciona CorsFilter. En este caso, no use @CrossOrigin
o 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:80
reenviar 192.168.0.76:8005
, es decir, la visita es en localhost:80
realidad una visita 192.168.0.76:8005
y la visita localhost:80/ssns-serve
es una visita localhost:8080
y ssns-serve
comienza 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() {
// ...
}
}