1. 过滤器 (实现 javax.servlet.Filter 接口)
① 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁.
② 可以对请求的URL进行过滤, 对敏感词过滤,
③ 挡在拦截器的外层
④ Filter 是 Servlet 规范的一部分
2. 拦截器 (实现 org.springframework.web.servlet.HandlerInterceptor 接口)
① 不依赖Spring容器, 可以使用 Spring 容器管理的Bean
② 拦截器通过动态代理进行
③ 拦截器应用场景, 性能分析, 权限检查, 日志记录
3. 监听器 (实现 javax.servlet.ServletRequestListener, javax.servlet.http.HttpSessionListener, javax.servlet.ServletContextListener 等等接口)
① 主要用来监听对象的创建与销毁的发生, 比如 session 的创建销毁, request 的创建销毁, ServletContext 创建销毁
拦截顺序:filter—>Interceptor---->@Aspect
过滤器,拦截到方法的请求和响应,并对请求响应做出响应的过滤操作,比如设置字符编码、鉴权操作
拦截器,有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等
aop,最大的优势在于可以获取执行方法的参数
过滤器:直接实现Filter接口,重写拦截方法,再到**@WebFilter**注解上配置拦截规则即可实现
/**
* * 使用注解标注过滤器
* @WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器
* 属性filterName声明过滤器的名称,可选
* 属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明(指定要过滤的URL模式是必选属性)
*/
@WebFilter(filterName="myXssFilter", urlPatterns="/*")
public class TimeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("执行过滤操作");
// *****业务处理
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
拦截器
和filter类似 实现HandlerInterceptor接口并重写拦截方法
public class MyInterceptor implements HandlerInterceptor{
//在请求处理之前进行调用(Controller方法调用之前
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.printf("我是拦截器:preHandle被调用");
HandlerMethod handlerMethod = (HandlerMethod) o;
Method method = handlerMethod.getMethod();
if (method.getAnnotation(interceptorLog.class) != null) {
return true;
}else{
return false;
}
}
//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("我是拦截器:postHandle被调用");
}
//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("我是拦截器:afterCompletion被调用");
}
}
//配置拦截器
@Configuration
public class WebAppConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor())
.addPathPatterns("/**"); // 拦截所有请求
}
@Bean
public MyInterceptor myInterceptor () {
return new myInterceptor();
}
}
过滤器与拦截器的区别
过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求; 简单点说:就是定义在访问某对象之前和访问之后要做的事情。
拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是方法调用,比如拦截敏感词汇。
另:监听器
listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。用于在事件发生前、发生后做一些必要的处理。其主要可用于以下方面:1、统计在线人数和在线用户2、系统启动时加载初始化信息3、统计网站访问量4、记录用户访问路径。
package com.example.demo;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
public static int online = 0;
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建session");
online ++;
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁session");
}
}
@RequestMapping("/online")
@ResponseBody
public Object online() {
return "当前在线人数:" + MyHttpSessionListener.online + "人";
}