SpringBoot過濾器使用
阿新 • • 發佈:2022-05-10
最近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,指定掃描的包。