Problemas entre dominios de Swagger y problemas de implementación de Nginx

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("*")y Access-Control-Allow-Originconfigurarlo, esta consola reportará el siguiente error:

Probablemente significa: allowCredentialses trueel tiempo, allowedOriginsno 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 :

  1. .allowedOrigins("域名")
  2. 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 GETy la solución es simple:
cambie extends WebMvcConfigurationSupporta implements WebMvcConfigurer
(el protected void addCorsMappingscambio 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:

  1. Un pozo de configuración de encabezado en una solicitud de dominio cruzado ajax
  2. SpringBoot implementa el acceso entre dominios (CORS) con separación de front-end y back-end
  3. ¿Qué es el dominio cruzado? Solución de dominio cruzado

Supongo que te gusta

Origin blog.csdn.net/weixin_43438052/article/details/113988318
Recomendado
Clasificación