Spring Boot 过滤器的实现
1,424 total views, 3 views today
过滤器是 Java Servlet 规范中定义的,它能够在请求传送给 Servlet 之前,对 ServletRequest 和 ServletResponse 做检查和修改,起到了过滤的作用。
SpringBoot 中实现过滤器
Spring Boot 中的过滤器是基于 Servlet 过滤器。第一步,定义过滤器的类,该类必须继承 Filter 接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; System.out.println("MyFilter: "+ req.getRequestURI()); chain.doFilter(request, response);//这步使得请求能够继续传导下去,如果没有的话,请求就在此结束 } @Override public void destroy() { } } |
第二步,注册过滤器,这步骤有 3 种方法。
方法 1. 在配置类中实现一个 FilterRegistrationBean 对象。
1 2 3 4 5 6 7 8 9 10 11 |
@Configuration public class WebConfig { @Bean public FilterRegistrationBean<MyFilter> abcFilter() { FilterRegistrationBean<MyFilter> filterRegBean = new FilterRegistrationBean<>(); filterRegBean.setFilter(new MyFilter()); filterRegBean.addUrlPatterns("/api/*"); filterRegBean.setOrder(Ordered.LOWEST_PRECEDENCE -1); return filterRegBean; } } |
方法 2. 使用@Component 和@Order 注解注册。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@Order(Ordered.LOWEST_PRECEDENCE -1) @Component public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; System.out.println("MyFilter: "+ req.getRequestURI()); chain.doFilter(request, response);//这步使得请求能够继续传导下去,如果没有的话,请求就在此结束 } @Override public void destroy() { } } |
这种方法的缺点是不能再指定 UrlPatterns,默认的 URL 模式就是/*
方法 3. 使用@WebFilter 和@ServletComponentScan 注解,@WebFilter 注解是 Servlet3.0 中的注解,SpringBoot 能够支持该注解,通过@ServletComponentScan 注解,能够扫描并注册到 Servlet 容器中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@WebFilter(urlPatterns="/api/*") public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; System.out.println("MyFilter: "+ req.getRequestURI()); chain.doFilter(request, response);//这步使得请求能够继续传导下去,如果没有的话,请求就在此结束 } @Override public void destroy() { } } |
还需要@ServletComponentScan 注解
1 2 3 4 5 6 7 8 |
@ServletComponentScan @SpringBootApplication public class SpringbootlearnApplication { public static void main(String[] args) { SpringApplication.run(SpringbootlearnApplication.class, args); } } |
@WebFilter 方式,可以支持 UrlPatterns 的设置,但是不支持 Order 的设置。
综上所述,第 1 种方法是最灵活的,也是最常用的一种。
参考:https://www.concretepage.com/spring-boot/spring-boot-filter
原创文章,转载请注明出处!http://www.javathings.top/spring-boot过滤器的实现/