过滤器和监听器
Posted 2324hh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过滤器和监听器相关的知识,希望对你有一定的参考价值。
过滤器和监听器都是Web开发中常用的组件,它们可以用来拦截请求和响应,对它们进行处理或修改,并在特定的事件发生时执行相应的操作。
过滤器如何实现功能
1在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。
2在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
3 Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,Web服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,doFilter方法中有一个filterChain对象,用于继续传递给下一个filter,在传递之前我们可以定义过滤请求的功能,在传递之后,我们可以定义过滤响应的功能
过滤器(Filter)是Java Servlet规范中的一种组件,它可以在请求到达Servlet之前或响应离开Servlet之后对请求和响应进行拦截和处理。过滤器通常用于实现一些通用的处理逻辑,例如:字符编码转换、身份验证、日志记录等。
监听器(Listener)是Java Servlet规范中的另一种组件,它可以监听Servlet容器中的事件,例如Web应用程序的启动、关闭、Session的创建和销毁等。监听器通常用于在处理请求和响应的过程中执行一些特定的操作,例如:初始化一些资源、清理一些资源等。
总的来说,过滤器和监听器都可以用来拦截请求和响应,在拦截过程中对它们进行处理或修改,并在特定的事件发生时执行相应的操作。它们的不同之处在于它们的用途和具体实现方式。
监听器和过滤器
过滤器
–过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求
–在请求到达Servlet/JSP之前,过滤器截获请求。
•Servlet API 中,与过滤器有关的API共有三个接口,分别是
–Filter
–FilterChain
–FilterConfig
import javax.servlet.*;
import java.io.IOException;
public class EcodingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");//执行统一的编码
//让请求继续向下执行,到达过滤链上的下一个资源(可能是过滤器,也可能是目标资源)
filterChain.doFilter(servletRequest,servletResponse);
}
}
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*验证用户已经登录*/
public class IsLoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String acount = (String) request.getSession().getAttribute("account");
System.out.println("用户是否登录过滤器");
if (acount == null) {
response.sendRedirect("login.jsp");
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
我们在web.xml文件中进行配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置过滤器-->
<filter>
<filter-name>isLoginFilter</filter-name>
<filter-class>com.filter.IsLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>isLoginFilter</filter-name>
<url-pattern>/success.jsp</url-pattern> <!-- 配置允许进入到过滤器的请求地址-->
</filter-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.filter.EcodingFilter</filter-class><!-- 文件的绝对路径 -->
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern> /* </url-pattern> <!-- /*表示访问本项目中的任何资源,都进入编码过滤器-->
</filter-mapping>
<!-- 配置session失效时间 以分钟为单位-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
过滤器总结:
过滤器用来实现通用的功能,减少代码冗余,提高可维护性
一个过滤器可以配置给多个资源使用
一个资源也可以配置多个过滤器,按照配置顺序调用
监听器
Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。
按监听对象分类:
- 用于监听应用程序对象(ServletContext)
- 用于监听用户会话对象(HttpSeesion)
- 用于监听请求消息对象(ServletRequest)
按监听事件分类:
- 监听对象的创建和销毁的事件监听器。
- 监听对象属性变更(添加,修改,移除)的监听器。
Servlet API中定义了监听器接口,用来监听不同的事件类型
–ServletContextListener:上下文监听器。
–ServletContextAttributeListener:上下文属性监听器。
–ServletRequestListener:请求监听器。
–ServletRequestAttributeListener:请求属性监听器。
–HttpSessionListener:会话监听器。
–HttpSessionAttributeListener:会话属性监听器。
import javax.servlet.*;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Date;
/*
监听器:监听servletContext.HttpSession和ServletRequest等域对象的创建和销毁事件
servletContext:生命周期开始服务器启动,结束于服务器关闭
HttpSession:开始于会话创建,结束于1.服务器关闭 2.30分钟未操作 3.强制销毁
ServletRequest:开始于请求,结束于服务器向客户端做出响应
*/
public class ObjectServlet implements ServletContextListener, HttpSessionListener, ServletRequestListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext创建");
ServletContext context = sce.getServletContext();
context.setAttribute("name", "1");
context.setAttribute("name", "1");
context.removeAttribute("name");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁");
}
long s;
@Override
public void requestInitialized(ServletRequestEvent sre) {
s = System.currentTimeMillis();
System.out.println("ServletRequest创建");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println(sre.getServletRequest().getLocalAddr() + ":::" + (new Date().getTime() - s));
System.out.println("ServletRequest销毁");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session销毁");
}
}
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/*
监听对象属性是否发生修改
*/
public class AttributeEvent implements ServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("添加属性" + scae.getName() + "::" + scae.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("删除属性" + scae.getName() + "::" + scae.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("更改属性" + scae.getName() + "::" + scae.getValue());
}
}
创建监听器类,实现监听器接口,在web.xml文件中配置监听器类。
<listener>
<listener-class>
监听器类全类名
</listener-class>
</listener>
以上是关于过滤器和监听器的主要内容,如果未能解决你的问题,请参考以下文章