Filter过滤器与Listener监听的使用

目录

一,Fileter

1.概述

2.过滤器使用场景

3.Filter快速入门

4.常用配置项

5.Filter生命周期

6.多个Filter的执行顺序

二,Listener

1.application监听器  servlet---ServletContext

2.Session监听器

3.request监听器

4.实例:监听在线人数


一,Fileter

1.概述

 过滤器实际上就是对web资源(HTML、CSS、Servlet、JSP)进行拦截,做一些处理后再交给下一个过滤器或servlet处理
通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理

2.过滤器使用场景

        自动登录
    统一设置编码格式
    访问权限控制
    敏感字符过滤等

3.Filter快速入门

(1)编写一个Filter,定义类实现接口Filter,实现接口中的抽象方法
    (2)在web.xml文件中配置访问过滤路径(和Servlet的配置有些相似)

4.常用配置项

urlPatterns
    以指定资源匹配。例如"/index.jsp"
    以目录匹配。例如"/servlet/*"
    以后缀名匹配,例如"*.jsp"
    通配符,拦截所有web资源。"/*"

5.Filter生命周期


(1)构造器:Filter的构造器在服务器启动时调用。 构造器只会调用一次,说明Filter也是单例多线程的。
    (2)init():在构造器被调用后,紧接着被调用。作用:用来初始化Filter。
    (3)doFilter():每一次拦截请求时都会调用。
    (4)destroy方法在项目停止时调用,用来在对象被销毁前做一些收尾工作。
 

6.多个Filter的执行顺序


    (1)在web.xml中,filter执行顺序跟<filter-mapping>的顺序有关,先声明的先执行
    (2)使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行
    (3)如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter
 

①web.xml配置
<filter>
	<description>配置filter(EncodingFilter)</description>
	<filter-name>encodingFilter</filter-name>
	<filter-class>com.zking.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
②URL通配符:
	①/*  所有界面
	②*.后缀  [*.do] 匹配所有后缀为do的界面

二,Listener

1.application监听器  servlet---ServletContext

  实现:ServletContextListener  (常用)
  重写:
 
  //容器启动时调用
  public void contextInitialized(ServletContextEvent event){
    
  }
 
  //容器消毁时调用
  public void contextDestroyed(ServletContextEvent event){
    
  }
 
 
  ServletContextEvent事件方法:
    .getServletContext()    //取得ServletContext对象,即上下文
 
  例示:
    event.getServletContext().getContextPath();

2.Session监听器

  实现:HttpSessionListener  (偶尔用)
  重写:
  //session创建时调用
  public void sessionCreated(HttpSessionEvent event){
 
  }
 
  //session销毁时调用
  public void sessionDestroyed(HttpSessionEvent event){
 
  }
 
 
  HttpSessionEvent事件方法:
	.getSession()	//取得当前的session
 
	例示:
	event.getSession().getId();	//得到session的ID
 实现:HttpSessionAttributeListener (不用,性能差)
  重写:
  //增加属性时触发
  public void attributeAdded(HttpSessionBindingEvent event){
	
  }
 
  //删除属性时触发
  public void attributeRemoved(HttpSessionBindingEvent event){
	
  }
 
  //替换属性时触发
  public void attributeReplaced(HttpSessionBindingEvent event){
	
  }
 
 
  HttpSessionBindingEvent事件方法:
	.getSession()	//取得session
	.getName()	//取得属性的名称
	.getValue()	//取得属性的内容
 
	例示:
	event.getSession()	//取得session
	event.getName()		//取得属性的名称
	event.getValue()	//取得属性的内容

3.request监听器

 实现:ServletRequestListener (不用,性能差)
  重写:
  //请求开始时调用
  public requestInitialized(ServletRequestEvent event){
 
  }
 
  //请求结束时调用
  public requestDestroyed(ServletRequestEvent event){
 
  }
 
 
  ServletRequestEvent事件方法:
	.getServletRequest()	//取得ServletRequest对象
	.getServletContext()	//取得ServletContext对象
 
	例示:
	event.getServletRequest().getRemoteAddr();	//得到IP地址
	event.getServletContext().getContextPath();	//得到当前路径

4.实例:监听在线人数

分析:创建一个会话就+1,销毁了会话则-1
      (在会话被创建时,往全局变量中+1;会话被关闭时,全局变量-1)
      服务器停止则移除 count

public class AppListrener implements ServletContextListener,HttpSessionListener {
	
	ServletContext app=null;
	
	//容器销毁时调用
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		System.out.println("容器销毁了");
		
	}
	//容器初始化时调用
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		System.out.println("容器初始化了");
		app=sce.getServletContext();
		Integer count=0;
		app.setAttribute("cut", count);
		System.out.println(count+"___");
	}
	
	//session创建时调用
	public void sessionCreated(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("session创建时调用");
		Integer count=(Integer)app.getAttribute("cut");
		
		if(count==null){
			count=0;
		}
		count++;
		System.out.println("创建时:"+count);
		app.setAttribute("cut", count);
	}
	
	//session销毁时调用
	public void sessionDestroyed(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("session销毁时调用");
		Integer count=(Integer)app.getAttribute("cut");
		
		if(count==null){
			count=0;
		}
		count--;
		System.out.println("注销时:"+count);
		app.setAttribute("cut", count);
	}
 
 
 
 
web.xml
 
  <listener>
  	<listener-class>com.servlet.AppListrener</listener-class>
  </listener>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值