过滤器和监听器

过滤器Filter

常用于:身份验证、日志记录、字符编码转换、数据压缩、权限检查

Java当中的过滤器位于客户端与服务器之间,对请求(request)和响应(response)进行预处理和后处理操作,它允许开发者在到达目标url之前或相应返回给客户端之前执行特定的代码

案例:解决乱码

定义过滤器类,实现javax.servlet.Filter接口,实现doFilter方法,设置字符编码集,然后放行request,response

package com.zxp.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * 编码过滤器类,用于统一设置请求和响应的编码格式,防止乱码问题。
 * 通过@WebFilter注解将该过滤器绑定到应用程序的所有资源上。
 */
@WebFilter("/*")
public class EncodingFilter implements Filter {
    /**
     * 过滤器初始化方法,该方法在过滤器实例化后立即调用。
     * @param filterConfig 过滤器配置对象,用于获取初始化参数。
     * @throws ServletException 如果初始化过程中出现异常。
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 该方法留空,不进行任何操作。
    }

    /**
     * 过滤方法,对请求和响应进行编码处理。
     * @param request Servlet请求对象,用于设置请求的编码格式。
     * @param response Servlet响应对象,用于设置响应的MIME类型和编码格式。
     * @param filterChain 过滤器链对象,用于将请求传递给下一个过滤器或servlet。
     * @throws IOException 如果处理请求或响应时发生I/O错误。
     * @throws ServletException 如果处理请求时发生servlet相关异常。
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        // 设置请求的字符编码为UTF-8
        request.setCharacterEncoding("UTF-8");
        // 设置响应的MIME类型为HTML,字符编码为UTF-8
        response.setContentType("text/html;charset=UTF-8");
        // 继续处理请求,将请求传递给下一个过滤器或servlet
        filterChain.doFilter(request, response);
    }

    /**
     * 过滤器销毁方法,该方法在过滤器实例被销毁前调用。
     * 可用于释放过滤器持有的资源。
     */
    @Override
    public void destroy() {
        // 该方法留空,不进行任何操作。
    }
}

监听器Listener

用来监听各种事件的发生,比如应用程序上下文的初始化和销毁、HTTP会话的创建和失效、以及请求参数的变化等。

添加注解后全局生效@WebListener

1. ServletContextListener

监听ServletContext(即Web应用程序上下文)的创建和销毁事件。 实现contextInitialized()和contextDestroyed()方法。

  • 服务器启动的时候会触发contextInitialized(),销毁的时候触发contextDestroyed()

package com.zxp.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.util.Date;
@WebListener
public class ApplicationListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("服务器启动时间"+new Date().toLocaleString());
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("服务器停止时间"+new Date().toLocaleString());
    }
}

2. ServletContextAttributeListener

监听ServletContext属性的增加、删除和替换事件。

  • 实现此接口的类重写attributeAdded()、attributeRemoved()和attributeReplaced()方法

3. HttpSessionListener

监听HttpSession的创建和销毁事件。

  • 实现此接口的类重写实现sessionCreated()和sessionDestroyed()方法

package com.zxp.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Date;
@WebListener
public class MySessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent hse) {
        String beginTime = new Date().toString();
        HttpSession session = hse.getSession();
        System.out.println("session创建时间:" + beginTime + "sessionId:" + session.getId());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        String endTime = new Date().toString();
        HttpSession session = httpSessionEvent.getSession();
        System.out.println("session销毁时间:" + endTime + "sessionId:" + session.getId());
    }
}

4. HttpSessionAttributeListener

监听HttpSession属性的增加、删除和替换事件。(登录时的用户算是增加的属性)

  • 实现此接口的类重写实现attributeAdded()、attributeRemoved()和attributeReplaced()方法

package com.zxp.listener;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class SessionAttrListener implements HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent hseb) {
        System.out.println("SessionID=="+hseb.getSession().getId());
        System.out.println("新增的属性是:"+hseb.getName()+"属性值是:"+hseb.getValue());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent hseb) {
        System.out.println("SessionID=="+hseb.getSession().getId());
        System.out.println("删除的属性是:"+hseb.getName()+"属性值是:"+hseb.getValue());
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent hseb) {

    }
}

5. 其他监听器

  • HttpSessionActivationListener

监听HttpSession的活化和钝化事件,主要用于会话的序列化和反序列化。 实现此接口的类重写sessionDidActivate()和sessionWillPassivate()方法。

  • HttpSessionBindingListener

监听对象与HttpSession的绑定和解除绑定事件。 实现此接口的对象会在自身被添加到或从HttpSession中移除时被通知。

  • ServletRequestListener

监听ServletRequest的初始化和销毁事件。 实现此接口的类重写requestInitialized()和requestDestroyed()方法。

  • ServletRequestAttributeListener

监听ServletRequest属性的增加、删除和替换事件。 实现此接口的类重写attributeAdded()、attributeRemoved()和attributeReplaced()方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值