天天看點

springboot配置過濾器filter-注解式@WebFilter, @Order, @ServletComponentScan

        好多文檔說的情況都不一樣, 針對自己遇到的情況做了總結, 有遇到相似的, 大家可以借鑒一下, 如果不适用你的項目, 可以發出來, 大家一起交流!

1. 首先自定義過濾器類需要實作Filter接口; 添加注解@WebFilter; 其中urlPatterns可以配置過濾的請求路徑,以及filterName過濾器名稱

package com.example.demo.controller.filter;

import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @author zwy
 * @date 2018/9/13
 */
//@Order規定多個Filter的執行順序,按照從小到大執行()中的值
@Order(1)
//@WebFilter過濾對應的請求路徑
@WebFilter(urlPatterns = {"/joker/user/*"},filterName = "loginFilter")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("我可以過濾/joker/user/的請求");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}
           

2. springboot啟動入口**application.java中增加@ServletComponentScan注解,

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

/**
 * @author zwy
 */
//加了@ServletComponentScan,無論過濾器類加不加@Componment都可以,單使用@Component會預設過濾/*,
@ServletComponentScan
@SpringBootApplication
public class DemoUserApplication extends SpringBootServletInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoUserApplication.class);
    }
}
           

啟動你就會發現已經成功了:

springboot配置過濾器filter-注解式@WebFilter, @Order, @ServletComponentScan

如果想配置多個過濾器, 怎麼控制過濾的先後順序,這時就需要在自定義過濾器類上面增加注解@Order(1):

裡面的值可以設定任意值, 但是執行的順序按照此值從小到大執行!

注意:

        有的人會遇到添加@Component, 本人親測, 如果入口不添加@ServletComponentScan注解, 過濾器添加@Component也可以起作用, 不過你配置的urlPatterns将會失效, 預設會過濾/*, 這時不妨入口添加@ServletComponentScan注解, 這時你會發現會過濾你配置的路徑, 而且無論你加不加@Component都不影響!

重點:2樓的朋友指出order注解不起作用,确實是,檢視好多部落格,大多的解決方案都是配置類裡配置順序才可以,這篇部落格的部落客給出了底層的不生效的原理:https://www.cnblogs.com/okong/p/correct-webfilter.html.還有就是定義類型稱的時候按A-Z是也可以排序,希望大家一起研究,有更好的方案,希望大家能給出來參考

繼續閱讀