天天看點

spring boot 筆記(二):filter通過配置來生成bean通過注解生成filter

為了簡潔,單獨寫一節用于記錄filter。

啟動spring boot項目時,在日志中可以看到如下資訊:

o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
           

上面顯示的資訊是預設過濾器的配置。

看出spring boot預設的filter設定了預設的四個filter:characterEncodingFilter,hiddenHttpMethodFilter,httpPutFormContentFilter,requestContextFilter。

那麼問題來了,如果想配置自定義的filter該怎麼做?

具體代碼如下:

通過配置來生成bean

@Configuration
public class WebConfiguration {

    @Bean //用于添加自定義的filter,并設定初始參數
    public FilterRegistrationBean testFilterRegistration() {

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

    public class MyFilter implements Filter {

        @Override
        public void destroy() {
        }

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

            HttpServletRequest request = (HttpServletRequest) srequest;
            System.out.println("this is MyFilter,url :"+request.getRequestURI());
            filterChain.doFilter(srequest, sresponse);
        }

        @Override
        public void init(FilterConfig arg0) throws ServletException {
        }
    }
}
           

隻需要想上述一樣,定義一個配置檔案,并為filter注入bean就行了。

通過注解生成filter

另一種通過全配置的方法如下:

@Order()
@WebFilter(filterName = "testFilter1",
        urlPatterns = "/*",
        initParams ={@WebInitParam(name="name", value="filter")})
public class MyFilter 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("TestFilter1:after");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {}
}
           

通過該種注解的方式配置filter,需要先啟用@ServletComponentScan配置。

@SpringBootApplication(scanBasePackages = "xxx.xxx.client.*")
@ServletComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}