监听器和过滤器
Posted XiaoFanMi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了监听器和过滤器相关的知识,希望对你有一定的参考价值。
过滤器
–过滤器位于客户端和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>
以上是关于监听器和过滤器的主要内容,如果未能解决你的问题,请参考以下文章