1. 程式人生 > 其它 >SpringBoot過濾器使用

SpringBoot過濾器使用

      最近SpringBoot專案中用到過濾器(Filter)和攔截器,發現網上的資料有很多不能夠正確執行,就自己整理寫了一個過濾器測試一下。

一 SpringBoot使用過濾器

SpringBoot使用過濾器有兩種方式 

1使用spring boot提供的FilterRegistrationBean註冊Filter 

2使用原生servlet註解定義Filter 

兩種方式的本質都是一樣的,都是去FilterRegistrationBean註冊自定義Filter

使用SpringBoot配置類實現:

2.1定義一個Filte

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("您已經進入過濾器");
        //
列印請求資訊
       
HttpServletRequest request = (HttpServletRequest) servletRequest;
        System.out.println ("------------- LogFilter 開始 -------------");
        System.out.println ("請求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
        System.out.println ("遠端地址: {}", request.getRemoteAddr());
        long startTime = System.currentTimeMillis
();
        System.out.println ("------------- LogFilter 結束 耗時:{} ms -------------", System.currentTimeMillis() - startTime);
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override public void destroy() {

    }
}

2.2註冊自定義MyFilter

@Configuration //定義此類為配置類,必須增加
public class FilterConfig {
    @Bean
    public FilterRegistrationBean myFilterRegistrationBean(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean(new MyFilter());
        //新增過濾器路徑
       
filterRegistrationBean.addUrlPatterns("/user/*");
        filterRegistrationBean.addUrlPatterns("/login/*");
        return filterRegistrationBean;

    }
}

2.3定義一個控制器Controller進行驗證

@Controller
public class HomeController {
@RequestMapping("/login")
public String login(){
    return "login";
}
@RequestMapping("/index")
public String index(){
    return "index";
}

}

執行程式,驗證結果。

使用註解方式實現:

3.1定義一個過濾器類Filter

在類的上方使用 @WebFilter 註解來建立Filter即可

//過濾器

@WebFilter(urlPatterns = "/myfilter")
@Component

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("您已經進入過濾器");
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override public void destroy() {
    }
}

}

3.2 在啟動類上面增加註解@ServletComponentScan

掃描filter包中的註解,然後執行程式進行測試。

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
@ServletComponentScan(basePackages = "com.example.demo.Filter")   
public class DemoApplication {

 SpringApplication.run(DemoApplication.class, args);
 
}

   注:這裡直接用@WebFilter就可以進行配置,同樣,可以設定url匹配模式,過濾器名稱等。這裡需要注意一點的是@WebFilter這個註解是Servlet3.0的規範,並不是Spring boot提供的。除了這個註解以外,我們需在啟動類中加註解:@ServletComponetScan,指定掃描的包。