Probleme mit domänenübergreifenden und Nginx-Bereitstellungsproblemen von Swagger

Domänenübergreifendes CROS-Prinzip

Die domänenübergreifende gemeinsame Nutzung von Ressourcen (CORS) ist ein Mechanismus, der mithilfe zusätzlicher HTTP-Header den Browser anweist, Webanwendungen, die auf einem Ursprung (einer Domäne) ausgeführt werden, den Zugriff auf bestimmte Ressourcen von verschiedenen Ursprungsservern zu ermöglichen. Wenn eine Ressource eine Ressource von einer Domäne oder einem Port anfordert, der sich von dem Server unterscheidet, auf dem sich die Ressource selbst befindet, initiiert die Ressource eine domänenübergreifende HTTP-Anforderung.

Mit dem CORS-Mechanismus (Cross-Domain Resource Sharing) können Webanwendungsserver eine domänenübergreifende Zugriffskontrolle durchführen, sodass die domänenübergreifende Datenübertragung sicher durchgeführt werden kann. Moderne Browser unterstützen die Verwendung von CORS in API-Containern (wie XMLHttpRequest oder Fetch), um das Risiko domänenübergreifender HTTP-Anforderungen zu verringern.

Domänenübergreifende Konfigurationsdatei 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/");
    }
}

Kann begegnen

(1) .allowedMethods ("*") Problem

Es ist bemerkenswert .allowedMethods("*")und Access-Control-Allow-Originkonfigurieren Sie es, diese Konsole meldet den folgenden Fehler:

Wahrscheinlich bedeutet: allowCredentialsist truedie Zeit, allowedOriginskann keinen speziellen Wert enthalten, " *" weil es nicht im " Access Control Allow Origin" als Antwort auf den Kopf des eingestellten Wertes steht. Damit Anmeldeinformationen auf eine Reihe von Quellen verweisen können, listen Sie diese bitte explizit auf oder verwenden Sie stattdessen " allowedOriginPatterns".

In diesem Fall gibt es zwei Lösungen, die zweite wird empfohlen :

  1. .allowedOrigins("域名")
  2. Vorschlagen.allowedOriginPatterns("*")

(2) 报错 osweb.servlet.PageNotFound : Keine Zuordnung für GET

Die obige Eingabeaufforderung wird auf der Konsole angezeigt o.s.web.servlet.PageNotFound :No mapping for GET, und die Lösung ist einfach:
Ändern Sie extends WebMvcConfigurationSupportzu implements WebMvcConfigurer
(die entsprechende protected void addCorsMappingsÄnderung zu public void addCorsMappings)

Nach der Bereitstellung von Nginx kann nicht auf Swagger zugegriffen werden

Stellen Sie 2 Methoden bereit, die erste wird bevorzugt

(1) Fügen Sie die Konfiguration direkt zur .yml-Konfigurationsdatei hinzu

springfox:
  	documentation:
    	swagger:
      		v2:
        		host: ip:8080

(2) Nginx-Proxy-Weiterleitungspfad für swagger-ui.html

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

Referenzmaterialien:

  1. Eine Grube zum Setzen von Headern in einer domänenübergreifenden Ajax-Anforderung
  2. SpringBoot implementiert den domänenübergreifenden Zugriff (CORS) mit Trennung von Front- und Back-End
  3. Was ist domänenübergreifend? Domänenübergreifende Lösung

Ich denke du magst

Origin blog.csdn.net/weixin_43438052/article/details/113988318
Empfohlen
Rangfolge