首页 > 解决方案 > 添加OncePerRequestFilter 是spring boot 应用程序后swagger 没有打开

问题描述

我已经在我的springboot应用程序中实现了OncePerRequestFilter,但是在添加过滤器后,swagger没有打开它给出401错误(这很明显)。我的问题是如何绕过过滤器中的招摇。

我在我的 pom 文件中只添加了这个依赖项

<dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>${swagger.springdoc.openapi}</version>
        </dependency>
        

这是我的过滤器文件的代码

@Component
public class RequestResponseFilter extends OncePerRequestFilter{
    
    @Inject
    private AuthService authService;


@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        
        if(request.getServletPath().contains(ApiResource.PING)) {
            response.setStatus(HttpServletResponse.SC_OK);
                return;
                
        }else if(request.getServletPath().contains("swagger-ui.html")){
            //return;
        }else if(request.getServletPath().contains("swagger-ui/index.html")){
            //return;
        }
        
        else {
        
             // Get the HTTP Authorization header from the request
            final String authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
    
            final boolean authStatus = authService.authenticate(authorizationHeader);
            if (!authStatus) {
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, 
                        "REST signature failed validation.");
                    return;
            }
        }
        filterChain.doFilter(request, response);
        
    }

}

我尝试添加我的招摇网址,正如您在其他情况下看到的那样(作为一种解决方法),但这也不起作用..

任何帮助,将不胜感激。

TIA

标签: javaspring-bootfilterswagger

解决方案


为了忽略特定的 URL,我们需要@Override shouldNotFilter.OncePerRequestFilter

我用下面的代码更新了我的配置。

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

@Component
public class AuthenticationFilter extends OncePerRequestFilter {

    private List<String> excludeUrlPatterns = new ArrayList<String>(Arrays.asList("/swagger-ui.html",
            "/swagger-uui.html", "/webjars/springfox-swagger-ui/springfox.css",
            "/webjars/springfox-swagger-ui/swagger-ui-bundle.js", "/webjars/springfox-swagger-ui/swagger-ui.css",
            "/webjars/springfox-swagger-ui/swagger-ui-standalone-preset.js",
            "/webjars/springfox-swagger-ui/springfox.js", "/swagger-resources/configuration/ui",
            "/webjars/springfox-swagger-ui/favicon-32x32.png", "/swagger-resources/configuration/security",
            "/swagger-resources", "/v2/api-docs",
            "/webjars/springfox-swagger-ui/fonts/titillium-web-v6-latin-700.woff2",
            "/webjars/springfox-swagger-ui/fonts/open-sans-v15-latin-regular.woff2",
            "/webjars/springfox-swagger-ui/fonts/open-sans-v15-latin-700.woff2",
            "/webjars/springfox-swagger-ui/favicon-16x16.png"));

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        System.out.println("Once per request filter is executed.");
    }

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
        String path = request.getRequestURI();
        if (excludeUrlPatterns.contains(path)) {
            return true;
        } else {
            return false;
        }
    }
}

推荐阅读