过滤器
-
使用场景:权限控制、用户登录状态控制
-
使用步骤
- 启动类增加@ServletComponentScan进行扫描
- 新建一个Filter类 implements Filter,并实现对应的接口
- @WebFilter标记类为filter,被spring扫描
- urlPatterns:拦截规则,支持正则
- 控制filterChain.doFilter的方法的调用,来实现是否通过放行
-
代码示例
package com.gen.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * 自定义过滤器 */ @WebFilter(urlPatterns = "/*") public class CustomFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
监听器
-
常用监听器分类
- ServletContextListener:应用启动监听器
- HttpSessionListener:会话监听器
- ServletRequestListener:请求监听器
-
代码示例
package com.gen.listener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; /** * 自定义监听器 */ @WebListener public class CustomListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println("=========requestDestroyed========="); } @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println("=========requestInitialized========="); } }
拦截器
-
拦截器:和过滤器用途基本类似
-
使用步骤
- 新建类implements WebMvcConfigurer
- 自定义拦截器HandlerInterceptor
- preHandle:调用Controller某个方法之前
- postHandle:Controller之后调用,视图渲染之前,如果控制器Controller出现了异常,则不会执行此方法
- afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理
- 自定义拦截器HandlerInterceptor
- 新建类implements WebMvcConfigurer
-
代码示例
package com.gen.config; import com.gen.interceptor.LoginInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CustomWebMvcConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(this.getLoginInterceptor()) // 拦截路径 .addPathPatterns("/*") // 不拦截路径 .excludePathPatterns("/test") ; } @Bean public LoginInterceptor getLoginInterceptor() { return new LoginInterceptor(); } }
package com.gen.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 登录拦截器 */ public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("自定义登录拦截器=========="); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
-
和Filter过滤器的区别
- Filter和Interceptor二者都是AOP编程思想的体现,功能基本都可以实现,拦截器功能更强大些,Filter能做的事情它都能做
- Filter只在Servlet前后起作用,而Interceptor能够深入到方法前后、异常抛出前后等
- Filter依赖于Servlet容器即web应用中,而Interceptor不依赖于Servlet容器所以可以运行在多种环境
- 在接口调用的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次
-
Filter和Interceptor的执行顺序
- 过滤器–>拦截前–>action执行–>拦截后–>过滤后