簡體   English   中英

如何根據URL模式應用spring boot過濾器?

[英]How to apply spring boot filter based on URL pattern?

我創建了一個spring boot過濾器 - 使用@Component注釋實現GenericFilterBean

@Component 
public class MyAuthenticationFilter  extends GenericFilterBean {
...
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
...
}
}

該過濾器由Spring Boot Framework自動識別,適用於所有REST API。 我希望此過濾器僅應用於某個URL路徑,例如/api/secure/*但我找不到正確的方法。 我試過@WebFilter但它不起作用。 我沒有使用XML配置或servlet初始化程序 - 只是注釋。

讓它運作的正確方法是什么?

您可以添加如下過濾器:

@Bean
public FilterRegistrationBean someFilterRegistration() {

    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(someFilter());
    registration.addUrlPatterns("/url/*");
    registration.addInitParameter("paramName", "paramValue");
    registration.setName("someFilter");
    registration.setOrder(1);
    return registration;
} 

@Bean(name = "someFilter")
public Filter someFilter() {
    return new SomeFilter();
}

如果您能夠擴展OncePerRequestFilter還有另一種選擇。 例如:

public class SomeFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // your filter logic ....
    }

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        String path = request.getServletPath();
        return !path.startsWith("/api/secure/");
    }
}

@ user1283002我認為可以使用@WebFilter。 我偶然發現了這篇文章 根據文章(沒試過自己):

@WebFilter(urlPatterns = "/api/count")
public class ExampleFilter implements Filter{
    // ..........
}

// and let Spring know to scan to find such @WebFilter annotation in your config
// class by using the @ServletComponentScan annotation like

@ServletComponentScan
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(MyApplication.class, args);
    }

   // ..........

}

編輯:在進一步閱讀@ServletComponentScan的文檔后,我發現了一個有趣的免責聲明

僅在使用嵌入式Web服務器時執行掃描

這意味着當在Web容器(例如:Apache Tomcat)中部署我們的應用程序時,Spring類不會掃描此類,因此不會應用任何彈簧配置(如果有)。

如果沒有進行Spring配置,你可以不進行任何進一步的更改,如果不是只是將@Component掃描添加到過濾器並確保它的包在@ComponentScan注釋的路徑中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM