四十九 过滤器和监听器

四十九章 — 过滤器和监听器

过滤器 Filter

监听器 Listener

一、掌握过滤器的使用

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

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

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

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

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

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

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

过滤器会过滤两次,一次请求过滤,一次响应过滤

在目标资源执行请求处理前进行过滤,在目标资源处理后响应前进行过滤

在这里插入图片描述

在这里插入图片描述

2.掌握过滤器的创建和配置

File接口: 类似于servlet接口 用于执行过滤操作的接口
在这里插入图片描述

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

在这里插入图片描述

  • 创建一个类实现过滤器接口
public class HelloFilter1 implements Filter {

	@Override
	public void destroy() {}

	// 执行过滤
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		System.out.println("----->正在执行请求过滤------>");
		filterChain.doFilter(request, response); // 放行
		System.out.println("----->正在执行响应过滤------>");
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {}

}
  • 在web.xml中配置此过滤器
 <!-- 配置过滤器 -->
  <filter>
  	<filter-name>helloFilter1</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/*</url-pattern>
  </filter-mapping>
  • 还可通过注解配置过滤器
@WebFilter(filterName="helloFilter2",urlPatterns= {"/hello/*"})
public class HelloFilter2 implements Filter {
    
}
3.Filter的生命周期【面试题】

回顾servlet的生命周期:

当第一次请求过来时,servlet容易会对对应的servlet进行实例化(构造方法)和初始化(init()方法)

每一次请求过来时,服务器都会执行servlet()方法后根据请求方式不同,执行doxx()方法

当服务器正常关闭时会调用servlet的destroy()销毁的动作

File的生命周期:

当服务器启动时,过滤器就会进行实例化(构造方法)和初始化(init()方法)
当情趣符合过滤规则时,会执行doFilter()方法,如果过滤合格,可以选择放行到下一个过滤器(过滤器链),同理响应时也会再次惊醒响应过滤

当服务器正常关闭时,会调用destory()销毁方法

在这里插入图片描述

4.理解过滤器链

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

在这里插入图片描述

5.初始化参数设置

类似于servlet的初始化参数配置

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

二、掌握监听器的使用

1.理解监听器的作用

监听器: 用于监听一些我们特别的作用域对象的活动的一种组件。

ServletContext (application作用域)、HttpSession(session作用域)、ServletRequest(request作用域)三个域对象

在这里插入图片描述

在这里插入图片描述

2.理解监听器的分类
  • 监听作用域创建和销毁的监听器
    • ServletContextListener :监听application,恰巧application又是服务器启动时开始
    • HttpSessionListener
    • ServletRequestListener
  • 监听作用域 属性列表的监听器
    • ServletContexttAttributeListener
    • HttpSessionAttributeListener
    • ServletRequestAttributeListener
  • 感知型监听器
    • HttpSessionBindingListener
    • HttpSessionActivationListener
3.掌握监听器的定义和配置

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

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

    public class MyListener2 implements HttpSessionAttributeListener {
    
    	// 属性添加
    	@Override
    	public void attributeAdded(HttpSessionBindingEvent sessionBindingEvent) {
    		String name = sessionBindingEvent.getName();
    		Object value = sessionBindingEvent.getValue();
    		System.out.println("有属性在添加!"+name+"-->"+value);
    	}
    
    	// 属性移除
    	@Override
    	public void attributeRemoved(HttpSessionBindingEvent sessionBindingEvent) {
    		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()+"上线了!");
	}
	
	// 当用户类型对象被解绑时触发
	@Override
	public void valueUnbound(HttpSessionBindingEvent event) {
		Object value = event.getValue();
		User loginUser = (User)value;
		System.out.println("用户:"+loginUser.getUsername()+"下线了!");
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet过滤器监听器是Java Web开发中的两个重要组件,可以在请求到达Servlet之前或者之后对请求和响应进行拦截、处理和修改,从而实现一些自定义的功能。 下面是Servlet过滤器监听器的配置及应用: 1. 过滤器的配置和应用: (1)在web.xml文件中配置过滤器: ```xml <filter> <filter-name>MyFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` (2)编写过滤器类: ```java public class MyFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { // 过滤器初始化代码 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 过滤器逻辑代码 chain.doFilter(request, response); } @Override public void destroy() { // 过滤器销毁代码 } } ``` (3)应用过滤器过滤器可以应用于所有的Servlet请求,或者只应用于特定的URL模式。在上面的配置中,我们将过滤器应用于所有的URL模式。 2. 监听器的配置和应用: (1)在web.xml文件中配置监听器: ```xml <listener> <listener-class>com.example.MyListener</listener-class> </listener> ``` (2)编写监听器类: ```java public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent event) { // 应用初始化代码 } @Override public void contextDestroyed(ServletContextEvent event) { // 应用销毁代码 } } ``` (3)应用监听器监听器可以监听应用程序的生命周期事件,比如应用程序的初始化、销毁等事件。在上面的配置中,我们将监听器应用于应用程序的初始化和销毁事件。 以上就是Servlet过滤器监听器的配置及应用的基本介绍。它们可以为我们提供很多灵活的机制来扩展和定制我们的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值