Java监听器过滤器拦截器

一. 监听器

6种需要在web.xml注册其实现类的监听器接口

(1) ServletContextListener 监听application创建销毁事件

(2) HttpSessionListener 监听session创建销毁事件

(3) ServletRequestListener 监听request创建销毁事件

(4) ServletContextAttributeListener 监听application属性变化事件

(5) HttpSessionAttributeListener 监听session属性变化事件

(6) ServletRequestAttributeListener 监听request属性变化事件

   <!-- 在web.xml中注册 -->
    <listener>
        <listener-class>
            frame.project.listener.ApplicationListener
        </listener-class>
    </listener>

2种需要在实体类中实现的监听器接口

(1) HttpSessionBindingListener 监听实体类在session中被绑定解绑事件

(2) HttpSessionActivationListener 监听实体类随session被序列化反序列化事件

二. 过滤器

//实现javax.servlet.Filter接口
public class MyFilter implements Filter{

    String param;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        param = filterConfig.getInitParameter("参数名");
        System.out.println("过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if(param.equals("参数值")) {
            chain.doFilter(req, res);
        } else {
            request.getRequestDispatcher("/error.jsp").forward(request, response);
        }
    }

    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}
<!-- 在web.xml中注册 -->
<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>frame.project.filter.MyFilter</filter-class>
    <init-param>
        <param-name>参数名</param-name>
        <param-value>参数值</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

三. 拦截器

//spring mvc方式:继承HandlerInterceptorAdapter类
public class RequestInterceptor extends HandlerInterceptorAdapter{

    /**
     * 在control之前执行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object)
            throws Exception {
        System.out.println("预处理");
        HandlerMethod handler = (HandlerMethod) object;
        if(true) {
            return true;
        } else {
            request.getRequestDispatcher("/error.jsp").forward(request, response);
            return false;
        }

    }

    /**
     * 在control之后,渲染页面之前执行
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("后处理");
    }

    /**
     * 拦截器抛出异常或请求完成后执行
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("待测试");
    }

    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("待测试");
    }

}
<!-- 在springMvc.xml中配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" /> <!-- 拦截的路径 -->
        <mvc:exclude-mapping path="/login"/> <!-- 跳过拦截的路径 -->
        <bean class="frame.project.interceptor.RequestInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

四. 监听器,过滤器,拦截器区别

1.监听器:监听request,session,application对象的创建销毁,属性改变等事件,触发执行代码
2. 过滤器和拦截器区别:
(1) 拦截器是基于java反射机制来实现的,而过滤器是基于函数回调来实现的。
(2) 拦截器不依赖servlet容器,过滤器依赖于servlet容器。
(3) 拦截器只对Action起作用,过滤器可以对所有请求起作用。
(4) 拦截器可以访问Action上下文和值栈中的对象,过滤器不能。
(5) 在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时调用一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值