过滤器(Filter) | 监听器(Listener) | 拦截器(Interceptor) | |
---|---|---|---|
关注点 | web请求 | 系统级别参数、对象 | Action(部分web请求) |
如何实现 | 函数回调 | 事件 | Java反射机制(动态代理) |
应用场景 | 设置字符编码、URL级别的权限访问控制、过滤敏感词汇、压缩响应信息 | 统计网站在线人数、清除过期session | 拦截未登录用户、审计日志 |
是否依赖servlet容器 | 依赖 | 不依赖 | |
servlet提供的支持 | Filter接口 | ServletContextListerner抽象接口、HttpSessionListener抽象接口 | Action(部分web请求)、HandlerinterceptorAdapter类 |
Spring提供的支持 | HandlerInterceptor接口 | ||
级别 | 系统级 | 系统级 | 非系统级 |
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
public class MyFilter implements Filter {
/**
* 初始化
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 过滤器拦截
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
/**
* 销毁
*/
@Override
public void destroy() {
}
}
**执行顺序 :**过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
**过滤器:**是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符.
**拦截器 :**是在面向切面编程的就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
监听ServletContext对象的创建和销毁?实现:ServletContextListener 接口,根据要求重写创建和销毁的方法。
package java.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 监听ServletContent对象的创建和销毁
*/
public class MyServletContextListener implements ServletContextListener {
/**
* 对象创建
* @param sce
*/
public void contextInitialized(ServletContextEvent sce) {
}
/**
* 对象销毁
* @param sce
*/
public void contextDestroyed(ServletContextEvent sce) {
}
}
Java Web开发中的监听器(listener)就是由application、session、request三个对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件
监听对象 | 监听接口 | 监听事件 |
---|---|---|
ServletRequest | ServletRequestListener | ServletRequestEvent |
ServletRequestAttributeListener | ServletRequestAttributeEvent | |
HttpSession | HttpSessionListener | HttpSessionEvent |
HttpSessionActivationListener | ||
HttpSessionAttributeListener | HttpSessionBindingEvent | |
HttpSessionBindingListener | ||
ServletContext | ServletContextListener | ServletContextEvent |
ServletContextAttributeListener | ServletContextAttributeEvent |