过滤器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()方法。