ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

过滤器和监听器

2019-07-10 16:06:31  阅读:117  来源: 互联网

标签:void value Override 监听器 过滤器 public


过滤器和监听器

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

过滤器 -->1.我们每次在servlet的实现类中 每次都要进行设置字符编码 文本格式;

         2.图片 pc端 手机端 下载下来的时候 图片大小不一致 --);

	  3.在新闻管理项目中,你的分类基本是不变的,用application作用域进行存储 但是什么时候存呢  (首页一打开就存?)  万一别人进的是添加页面

	  4.你在浏览网页 提示让你登录以后才能进行别的操作 

1. 掌握过滤器的使用

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

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

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

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

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

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

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

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

目标资源如 jsp页面/servlet等

web容器就是 tomcat

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

接口是一种能力

ctrl+shift+t全局搜索类

ctrl+t查看继承体系

ctrl+o查看方法

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

void init(FileterConfig filterConfig) Web容器调用该方法实现过滤器的初始化

void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain)当客户端请求资源时,Web容器会调用资源与对应的过滤器的doFilter()方法。在该方法中,可以对请求和响应进行处理,实现过滤器的功能

void destroy() Web容器销毁过滤器时调用该方法,可以用来释放过滤器所用的资源

**FilterConfig接口:**类似于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
      	 -->
    //  /hello/*  如果没有前面的/  就是包含hello就可以   加上表示目录     
      	<url-pattern>/hello/*</url-pattern>
      </filter-mapping>
    

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

@WebFilter(filterName="helloFilter2",urlPatterns= {"/hello/*"})
public class HelloFilter2 implements Filter {
    
}

1.3 Filter的生命周期【面试题】

回顾Servlet的生命周期:

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

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

当服务器被正常关闭的时候会调用Servlet的destroy方法

Filter的生命周期:

当服务器启动时,过滤器就会进行实例化(构造方法)和初始化(init方法)!

当请求符合过滤器过滤规则时,会执行doFilter方法,如果过滤合格,可以选择放行到下一个过滤器(过滤器链),同理响应时也会再次进行响应过滤。

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

[外链图片转存失败(img-PmcQv8A7-1562744574765)(assets/1562727963212.png)]

1.4 理解过滤器链

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

[外链图片转存失败(img-9uJ4a2I4-1562744574767)(assets/1562727978853.png)]

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作用域)三个域对象

[外链图片转存失败(img-1QymY32h-1562744574768)(assets/1562729257064.png)]

[外链图片转存失败(img-acAU6ggA-1562744574769)(assets/1562732110783.png)]

2.2 了解监听器的分类

  • 监听作用域创建和销毁的监听器
    • ServletContextListener
    • HttpSessionListener
    • ServletRequestListener
  • 监听作用域属性列表变化的监听器
    • ServletContextAttributeListener
    • HttpSessionAttributeListener
    • ServletRequestAttributeListener
  • 感知型监听器
    • 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 {
    
    	// 属性添加
    	@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()+"下线了!");
    	}
    	
    }
    

println(“用户:”+loginUser.getUsername()+“上线了!”);
}

// 当用户类型对象被解绑时触发
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
	Object value = event.getValue();
	User loginUser = (User)value;
	System.out.println("用户:"+loginUser.getUsername()+"下线了!");
}

}

标签:void,value,Override,监听器,过滤器,public
来源: https://blog.csdn.net/weixin_44637905/article/details/95342438

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有