背景
项目中经常需要用拦截器或者过滤器,这一期主要进行一个简单的自定义过滤器。
一、 两种实现过滤器的方式
1.直接继承这个抽象的一次预处理Filter,不用重写更多方法,也强大方便。
public class AuthFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { System.out.println("我执行了:AuthFilter"); String url = request.getServletPath(); if (url.equals("/login")){ System.out.println("login~~~~~~"); }; filterChain.doFilter(request,response); } }
2.实现传统的Filter接口
public class CookieFilter 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; HttpServletResponse rep = (HttpServletResponse) response; String url = req.getServletPath(); System.out.println("我执行了:CookieFilter"); if (url.equals("/test")){ System.out.println("不允许访问"); rep.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } } @Override public void destroy() { } }
二、 注册到容器中
通过
@Configuration和@Bean 标签注解,实现注入spring容器Bean, 并且用FilterRegistrationBean把我们的过滤器 注册好。
@Configuration public class MyFilter { @Bean public FilterRegistrationBean getCookieFilter(){ FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new CookieFilter()); registration.addUrlPatterns("/*"); registration.addServletNames("cookieFilter"); registration.setOrder(2); return registration; } @Bean public FilterRegistrationBean getAuthFilter(){ FilterRegistrationBean registration = new FilterRegistrationBean();
//注册你的过滤器 registration.setFilter(new AuthFilter());
//新增拦截路径,这里是代表所有请求 registration.addUrlPatterns("/*"); registration.addServletNames("authFilter");
// 过滤器执行优先级 registration.setOrder(1); return registration; } }
三、 关于排序order
order越小,顺序越优先,执行服务跑起来看看结果:
原文:https://www.cnblogs.com/rick-Lee/p/14993489.html