linux

Linux下Swagger如何处理跨域问题

小樊
45
2025-09-16 06:35:15
栏目: 智能运维

在Linux环境下,处理Swagger跨域问题的方法与在其他操作系统下的方法相同。这里提供两种解决方案:一种是通过配置Swagger自身来解决跨域问题,另一种是通过修改Nginx或Apache等Web服务器的配置来实现跨域。

方案一:配置Swagger自身解决跨域问题

  1. 打开Swagger配置文件。通常情况下,这个文件名为swagger-config.yamlswagger-config.json。如果你使用的是Springfox库,那么配置文件可能是SwaggerConfig.java

  2. 在配置文件中添加以下内容:

    对于swagger-config.yamlswagger-config.json文件:

    swagger:
      cors:
        allowed-origins: ["*"]
        allowed-methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
        allowed-headers: ["Content-Type", "Authorization", "X-Requested-With"]
        allow-credentials: true
    

    对于SwaggerConfig.java文件(使用Springfox库):

    import springfox.documentation.builders.PathSelectors;
    import springfox.documentation.builders.RequestHandlerSelectors;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
        @Bean
        public Docket api() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .select()
                    .apis(RequestHandlerSelectors.any())
                    .paths(PathSelectors.any())
                    .build()
                    .apiInfo(apiInfo())
                    .useDefaultResponseMessages(false)
                    .globalOperationParameters(Collections.singletonList(new ParameterBuilder()
                            .name("Authorization")
                            .description("Access token")
                            .modelRef(new ModelRef("string"))
                            .parameterType("header")
                            .required(false)
                            .build()))
                    .securitySchemes(Arrays.asList(apiKey()))
                    .securityContexts(Arrays.asList(securityContext()));
    
            // 添加跨域配置
            ApiInfo apiInfo = new ApiInfoBuilder()
                    .title("API文档")
                    .description("API文档描述")
                    .version("1.0")
                    .build();
    
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo)
                    .host("your-host")
                    .protocols(newHashSet("http", "https"))
                    .forCodeGeneration(true)
                    .directModelSubstitute(LocalDate.class, String.class)
                    .genericModelSubstitutes(ResponseEntity.class)
                    .useDefaultResponseMessages(false)
                    .globalOperationParameters(Collections.singletonList(new ParameterBuilder()
                            .name("Authorization")
                            .description("Access token")
                            .modelRef(new ModelRef("string"))
                            .parameterType("header")
                            .required(false)
                            .build()))
                    .securitySchemes(Arrays.asList(apiKey()))
                    .securityContexts(Arrays.asList(securityContext()))
                    .corsConfiguration(new CorsConfiguration()
                            .allowedOrigins(Arrays.asList("*"))
                            .allowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"))
                            .allowedHeaders(Arrays.asList("Content-Type", "Authorization", "X-Requested-With"))
                            .allowCredentials(true));
        }
    }
    
  3. 保存配置文件并重启应用。

方案二:修改Nginx或Apache等Web服务器的配置来实现跨域

如果你使用的是Nginx作为Web服务器,可以在配置文件中添加以下内容:

location / {
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Content-Length' 0 always;
        add_header 'Content-Type' 'text/plain charset=UTF-8' always;
        return 204;
    }

    add_header 'Access-Control-Allow-Origin' '*' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;

    # 其他配置...
}

如果你使用的是Apache作为Web服务器,可以在.htaccess文件或httpd.conf文件中添加以下内容:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
    Header set Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"
    Header set Access-Control-Allow-Credentials "true"
</IfModule>

保存更改并重启Web服务器。

这样,Swagger就可以处理跨域问题了。请注意,允许所有来源(*)可能会导致安全问题。在生产环境中,建议将*替换为实际允许访问的域名。

0
看了该问题的人还看了