Directorio de artículos
Principio de dominio cruzado CROS
El uso compartido de recursos entre dominios (CORS) es un mecanismo que utiliza encabezados HTTP adicionales para indicarle al navegador que permita que las aplicaciones web que se ejecutan en un origen (dominio) accedan a recursos específicos desde diferentes servidores de origen. Cuando un recurso solicita un recurso de un dominio o puerto diferente del servidor donde se encuentra el recurso, el recurso inicia una solicitud HTTP entre dominios.
El mecanismo de intercambio de recursos entre dominios (CORS) permite que los servidores de aplicaciones web realicen un control de acceso entre dominios, de modo que la transmisión de datos entre dominios se pueda realizar de forma segura. Los navegadores modernos admiten el uso de CORS en contenedores de API (como XMLHttpRequest o Fetch) para reducir el riesgo de solicitudes HTTP entre dominios.
Archivo de configuración entre dominios CorsConfig
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
/**
* @version 1.0
* @classname CorsConfig
* @description 解决跨域问题,重写父类提供的跨域请求处理的接口
* @date 2021/2/23 22:06
* @created by MelodyJerry
*/
@Configuration
@EnableWebMvc
//public class CorsConfig implements WebMvcConfigurer { //控制台提示No mapping for GET时,替换下行
public class CorsConfig extends WebMvcConfigurationSupport {
/*
* 这里主要为了解决跨域问题,所以重写addCorsMappings方法
*/
@Override
//public void addCorsMappings(CorsRegistry registry) { //控制台提示No mapping for GET时,替换下行
protected void addCorsMappings(CorsRegistry registry) {
//设置允许跨域的路径
registry.addMapping("/**") //所有的当前站点的请求地址,都支持跨域访问
//设置允许跨域请求的域名,二选一allowedOrigins或allowedOrigins
//.allowedOrigins("*") //注意access-control-allow-origin时,allowedOrigins不能为*
//.allowedOrigins("域名") //如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名
.allowedOriginPatterns("*") // 所有的外部域都可跨域访问
//放行哪些原始域(请求方式)
.allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS")
//设置允许的请求头
.allowedHeaders("*")
//暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
.exposedHeaders("access-control-allow-headers",
"access-control-allow-methods",
"access-control-allow-origin",
"access-control-max-age",
"X-Frame-Options")
//是否允许证书(是否支持跨域用户凭证),不再默认开启
.allowCredentials(true)
//跨域允许时间
.maxAge(3600);
}
/*
* 跨域配置后swagger2可能不能访问,需要增加如下配置
* 原因: 不能访问的原因的swagger的内置接口被拦截器拦下来了,需要将swagger加到拦截器的排除列表中。
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
Puede encontrar
(1) problema de .allowedMethods ("*")
Cabe destacar
.allowedMethods("*")
yAccess-Control-Allow-Origin
configurarlo, esta consola reportará el siguiente error:Probablemente significa:
allowCredentials
estrue
el tiempo,allowedOrigins
no puede contener un valor especial, "*
" porque no está en el "Access Control Allow Origin
" en respuesta a la cabeza del valor establecido. Para permitir que las credenciales apunten a un conjunto de fuentes, indíquelas explícitamente o considere utilizar "allowedOriginPatterns
" en su lugar .Hay dos soluciones en este caso, se recomienda la segunda :
.allowedOrigins("域名")
- Sugerir
.allowedOriginPatterns("*")
(2) 报错 osweb.servlet.PageNotFound : No hay mapeo para GET
El mensaje anterior aparece en la consola o.s.web.servlet.PageNotFound :No mapping for GET
y la solución es simple:
cambie extends WebMvcConfigurationSupport
a implements WebMvcConfigurer
(el protected void addCorsMappings
cambio correspondiente a public void addCorsMappings
)
No se puede acceder a Swagger después de implementar Nginx
Proporcione 2 métodos, se prefiere el primero
(1) Agregue la configuración directamente al archivo de configuración .yml
springfox:
documentation:
swagger:
v2:
host: ip:8080
(2) Nginx proxy forwarding swagger-ui.html ruta relacionada
location /swagger-ui.html {
proxy_pass http://ip:port;
index index.html index.htm;
}
location /webjars {
proxy_pass http://ip:port;
index index.html index.htm;
}
location /swagger-resources {
proxy_pass http://ip:port;
index index.html index.htm;
}
location /v2 {
proxy_pass http://ip:port;
index index.html index.htm;
}
Materiales de referencia: