过滤器和监听器
过滤器监听器
过滤器:
概念:
过滤器是能够对web请求和web响应的头属性和内容体进行操作的一种特殊web组件
过滤器的特殊之处在于本身并不直接生成web响应,而是拦截web请求和响应,以便查看、提取或以某种方式操作客户机和服务器之间交换的数据
过滤器的功能:
分析web请求,对输入数据进行预处理
阻止web请求和响应的进行
根据功能改动请求的头信息和数据体
与其他web资源协作
工作原理:
过滤器的API包插javax.servlet包中的Filter,FilterChain和FilterConfig三个接口
所有的过滤器都必须实现javax.servlet.Filter接口,该接口定义了init()、doFilter()和destory()三个方法
这三个方法分别对应了过滤器生命周期中的初始化、响应和销毁这三个阶段
代码实现:
package com.wp.controller;/*
*@author wupeng
*@time 2021/6/23-20:41
实现自定义过滤器:
完成请求的拦截以及资源的通用管理
使用方法:
定义普通java类,实现filter接口
重写其中的方法:
init:完成初始化,tomcat启动的时候执行一次
dofilter:进行处理 每次的发送请求都会执行一次
destory:销毁功能 tomcat关闭的时候执行
生命周期:从tomcat启动到tomcat关闭
filterChina:表示过滤器链,在项目中可以定义N多个过滤器,当开始执行的时候,根据用户请求把符合规则的过滤器挨个执行
建议:每个过滤器完成独立的功能,不要将所有的逻辑处理放置到同一个过滤器你中,耦合性高,不利于维护
在过滤器的文本.xml配置文件中,可以指定过滤器过滤哪些请求
/*.匹配所有请求
/*.do匹配所有后缀为do的请求
/filter.do:匹配请求为filter.do的请求
<filter>
<filter-name>filter</filter-name> 配置filter的别名
<filter-class>com.wp.controller.MyFilter</filter-class> 配置filter指定的类名
</filter>
<filter-mapping>
<filter-name>filter</filter-name> 配置别名与filter上的标签匹配
<url-pattern>/*</url-pattern> 表示要匹配的请求
</filter-mapping>
*/
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(servletNames = {"/filter"},filterName = "simplefilter")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter doFilter");
//添加此语句之后才能调用到对应的servlet
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("filter 处理完毕");
}
@Override
public void destroy() {
System.out.println("filter destory");
}
}
小案例:
package com.wp.filter;/*
*@author wupeng
*@time 2021/6/23-21:15
*/
import com.sun.deploy.net.HttpResponse;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("登录过滤器的初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("登录过滤器编码处理");
HttpSession session = ((HttpServletRequest) servletRequest).getSession();
if(session.getAttribute("user")==null) {
((HttpServletResponse)servletResponse).sendRedirect("login.jsp");
} else {
filterChain.doFilter(servletRequest,servletResponse);
}
System.out.println("登录过滤器编码处理完成");
}
@Override
public void destroy() {
System.out.println("登录过滤器被销毁");
}
}
package com.wp.filter;/*
*@author wupeng
*@time 2021/6/23-21:12
设置编码过滤器
*/
import javax.servlet.*;
import java.io.IOException;
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("编码过滤器的初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("编码过滤器的逻辑处理");
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html:charset=utf-8");
System.out.println("编码过滤器执行完成");
}
@Override
public void destroy() {
System.out.println("编码过滤器被销毁");
}
}
监听器:
概念:
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理
通过实现Servlet API提供的Listense接口,可以在监听正在执行的某一个程序,并且根据程序的需求做出适当的响应
Servlet2.3提供了对ServletContext和HttpSession对象的状态变化的监听器,Servlet2.4则增加了对ServletRequest对象状态变化的监听器
ServletContext对象----监听ServletContext对象,可以使web应用得知web组件的加载和卸载等运行情况
HttpSession对象----监听HttpSession对象,可以使web应用了解会话期间的状态并做出反应
ServletRequest对象----监听ServletRequest对象,可以使web应用控制web请求的生命周期
监听器的类型:
request监听器:
package com.wp.listens;/*
*@author wupeng
*@time 2021/6/23-21:28
监听器:监听作用域对象的创建和销毁以及属性的相关配置,可以添加一些公共的属性配置,做逻辑判断
主要监听三种作用域
ServletContext(Session)
Session
request
接口有两个: ServletRequestListener(监听request对象的创建和销毁),
ServletRequestAttributeListener(监听request作用域域属性的添加,删除和更改)
*/
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import java.util.Date;
@WebListener("/listen")
public class MyListense implements ServletRequestListener, ServletRequestAttributeListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("销毁" + new Date());
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("初始化");
}
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("属性添加时候的逻辑代码");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("属性删除时候做的逻辑");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("属性更改时做的事情");
}
}
ServletContext:
package com.wp.listens;/*
*@author wupeng
*@time 2021/6/23-21:38
servletContext:
接口 ServletContextListener监听serxletcontext对象的创建和销毁
public void contextInitialized(ServletContextBvent servletContextEvent)
创建对象,当启动 tomcat服务器的时候创建
public void contextDestroyed(ServletContextEvent servletContextEvent)
ServletContextAttributeListener监听Servletcontext对象的属性的添加和删除和更改
*/
import javax.servlet.*;
public class MyListense2 implements ServletContextListener, ServletContextAttributeListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("初始化");
}
HttpSession
package com.wp.listens;/*
*@author wupeng
*@time 2021/6/23-21:49
Session:
HttpSessionListener
public void sessionCreated(HttpSessionEvent httpSessionEvent)
session对象创建的时候执行
public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
session对象销毁的时候执行
HttpSessionActivationListener:监听session对象中属性的添加,删除和更改
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent)
添加属性的时候被调用
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent)
删除属性的时候被调用
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent)
更改数据的时候被调用
*/
import javax.servlet.http.*;
public class MyListense3 implements HttpSessionListener, HttpSessionAttributeListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session对象创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("sessioin对象销毁");
}
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
}
}
案例:统计当前在线人数
package com.wp.listens;/*
*@author wupeng
*@time 2021/6/23-21:49
Session:
HttpSessionListener
public void sessionCreated(HttpSessionEvent httpSessionEvent)
session对象创建的时候执行
public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
session对象销毁的时候执行
HttpSessionActivationListener:监听session对象中属性的添加,删除和更改
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent)
添加属性的时候被调用
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent)
删除属性的时候被调用
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent)
更改数据的时候被调用
*/
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.*;
public class MyListense3 implements HttpSessionListener, ServletContextListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
//获取application对象
ServletContext context = httpSessionEvent.getSession().getServletContext();
int count = (int)context.getAttribute("count");
context.setAttribute("cont",++count);
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
//获取application对象
ServletContext context = httpSessionEvent.getSession().getServletContext();
int count = (int)context.getAttribute("count");
context.setAttribute("cont",--count);
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//获取application
ServletContext sc = servletContextEvent.getServletContext();
//设置网站在线人数的初始值
sc.setAttribute("count",0);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("sevletContext被销毁");
}
}