57过滤器和监听器

本文围绕Web三大组件中的过滤器和监听器展开。介绍了过滤器的特点、执行原理、创建配置、生命周期、过滤器链及初始化参数设置;还阐述了监听器的作用,包括监听三个作用域对象,介绍其分类,并说明了各类监听器的定义和配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过滤器和监听器

web三大组件:servlet,过滤器和监听器

1.掌握过滤器的使用

1.1 理解过滤器的特点和执行原理

每次在请求前都要进行一系列的编码问题解决和响应格式问题解决。

每次请求前需要记录请求日志,响应后也需要记录响应日志。

检查当前用户是否有处理目标资源的权限。(查看用户是否登录)

过滤器就可以实现上述的处理。

过滤器用于拦截传入的请求和传出的响应,监视,修改或以某种方式处理正在客户端和服务器之间交换的数据流。

过滤器会过滤两次,一次请求过滤,一次响应过滤。
在目标资源执行请求处理前进行过滤 ,在目标资源处理后响应前进行过滤。在这里插入图片描述在这里插入图片描述

1.2 掌握过滤器的创建和配置

Fiter接口:类似于Servlet 用于执行过滤操作的接口

在这里插入图片描述

FilterConfig接口:类似于ServletConfig接口 用于获取Filter配置参数信息的接口

在这里插入图片描述

创建一个类实现过滤器接口

public class HelloFiter1 implements Filter{
	@Override
	public void destroy(){}
	
	//执行过滤
	@Override
	public void doFilter(ServletRequest request,ServletResponse response,FilterChain,filterChain)
	throws IOException,ServletException{
	System.out.println("-->正在执行请求过滤-->");
	filtemChain.doFilter(request,respone);//放行
	System.out.println("-->正在执行响应过滤-->");
	}
	
	@Override
	public void init(FilterConfig filterConfig)throws ServletException{}
}

在web.xml中配置此过滤器

<!--配置过滤器-->
<filter>
<filter-name>helloFilte1</filter-name>
<filter-class>cn.kgc.demo1.HelloFilter1</filter-class>
</filter>

<filter-mapping>
<filter-name>helloFilter1</filter-name>
<!--http://localhost:8080/newsmgr/xx/xxx?opr=xxx-->
<!--过滤器能够给那些请求进行过滤(过滤规则)-->
<!--此规则同样适用于servlet-->
<!--
完全匹配:
	例如:/hello 它只能匹配到
	http:localhost:8080/newsmgr/hello
		目录匹配:
			例如:/hello/*
			它能匹配到:
	http:localhost:8080/newsmgr/hello/test1
			它能匹配到:
	http:localhost:8080/newsmgr/hello/test2/xxx
    		扩展名匹配:
    			例如:
    				*.do
    				*.action
    				*.html
    				它能匹配到:
    http:localhost:8080/newsmgr/xxx/xxx/xx.do
    	-->
    	<url-pattern>/hello/*</ur1-pattern>
    	</filter-mapping>
    				

还可以通过注解配置过滤器。

@webFilter(filterNane="helloFilter2",urlPatterns={"/hello/"})
public class HelloFilter{

}
1.3 Filter的生命周期【面试题】
回顾Servlet的生命周期:

当第一次请求过来的时候,服务器会对对应的Servlet进行实例化(构造方法)和初始化(init()方法)

每一次请求过来的时候,服务器都会执行service方法然后根据请求方式的不同,执行doXx()方法。

当服务器正常关闭时,会调用destroy方法进行销毁。

在这里插入图片描述

1.4 理解过滤器链

当多个过滤器的匹配规则都处于交集状态,那么会形成过滤器链,执行完对应的过滤器之后,会依次执行后续的,最后才执行目标资源。(它的顺序由web.xml中的filter-mapping标签决定)

在这里插入图片描述

]

1.5 初始化参数设置

类似于Servlet的初始化参数配置。

@webFilter(
		filterName="characterEncodingFilter",
		urlPatterns={"/*"}
		initParams={
			@WebInitParam(name="encoding",value="UTF-8")
		}
		)
		public class CharacterEncodingFilter implements Filter{
		
		}

2.掌握监听器的使用

理解监听器的作用

2.1 理解监听器的作用

监听器:用于监听我们一些特别的作用域对象的活动的一种组件。
监听器:用于监听我们一些特别的作用域对象的一种组件。
ServletContext(application作用域),
HttpSession(session作用域),
ServletRequest(request作用域)三个域对象

在这里插入图片描述在这里插入图片描述

2.2 了解监听器的分类
监听作用域创建和销毁的监听器

ServletContextListener

HttpSessionListener

ServletRequestListener

监听作用域属性列表变化的监听器

ServletContextAttributrListener

HttpSessionAttributeListener

ServletAttributeRequestListener

感知型监听器

HttpSessionBindingListener

HttpSessionActivationListener

2.3 掌握监听器的定义和配置

监听作用域创建和销毁的监听器

创建一个监听器实现对应的监听器接口

public class MyListener1 implements ServletContextListener{

	//监听销毁
	@Override
	public void contextDestroyed(ServletContextEvent arg0){
		
       	System.out.println("正在执行销毁");
	}
	//监听初始化
	
	@Override
	public void contextInitialized(ServletContextEvent arg0){
				System.out.println("正在执行初始化");
	}
}

在web.xml中配置对应的监听器全类名

<listener>
	<listener-class>cn.kgc.demo1.MyListener1</listener-class>
</listener>
监听作用域属性列表变化的监听器

创建一个监听器实现对应的监听器接口

public class MyListener2 implements HttpSessionAttributeListener{

	//属性添加
	@Ovrride
	public void attributeAdded(HttpSessionBindingEvent sessionBindingEvent){
	String name = sessionBindingEvent.getName();
	Object value = sessionBindingEvent.getvalue();
	System.out.println("有属性在添加"+name+"-->"+value);
	}
	//属性移除
	public void attributeRemoved(HttpSessionBindingEvent sessionBindingEvebt){
	String name = sessionBindingEvent.getName();
		Object value = sessionBindingEvent.getValue();
		System.out.println("有属性在移除!"+name+"-->"+value);
	}
	//属性替换
		@Override
	public void attributeReplaced(HttpSessionBindingEvent sessionBindingEvent) {
		String name = sessionBindingEvent.getName();
		Object value = sessionBindingEvent.getValue();
		System.out.println("有属性在替换!"+name+"-->"+value);
	}
}

在web.xml中配置

<listener>
	<listener-class>cn.kgc.demo1.MyListener1</listener-class>
</listener>

感知型监听器

在需要感知的类型上去实现对应的接口

实现对应的感知方法即可

public class User implements
Serializable,HttpSessionBindingListener{
	private static final long serialVersionUID = 1L
	
	private String username;
	private String password;
	
	//省略getter/setter和构造
	@Override
	public String toString(){
		return "User [username="+ username + ",password="+password +"]";
	}
	//当用户类型对象被绑定时触发
	//session.setAttribute();
		@Override
	public void valueBound(HttpSessionBindingEvent event){
		Object value = event.getValue();
		User loginUser = (User)value;
		System.out.println("用户:"+loginUser.getUsername()+"下线了!");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值