第七章 过滤器


总结

第7章 过滤器
1.	过滤器:一个用于拦截数据源和目的地之间消息的对象
2.	特点:线程不安全
3.	定义过滤器:实现过滤器接口(Filter)
4.	生命周期的方法
init(FilterConfig config)
doFilter(ServletRequest request, 
ServletResponse response, 
FilterChain chain){
……用于拦截请求
chain.doFilter(request, response);//分水岭
……用于拦截响应
}
destroy()
5.	过滤器的功能
拒绝请求:自己产生一个响应,返回给客户端
传递请求:将请求传递给过滤器链中的下一个过滤器,如果该过滤器是过滤器链中的最后一个过滤器,就将请求传递给目标资源。
篡改请求:直接将请求转发给其他资源
6.	过滤器的配置
web.xml: <filter> <filter-mapping>
注解:@webFilter(
filterName
urlPatterns
initParams{ @webInitParam(),…}
)
7.	过滤器的执行顺序
拦截请求的顺序:
web.xml中配置的过滤器的正序,注解配置的过滤器的类名称的自然顺序
拦截响应的顺序:拦截请求的顺序的逆序
8.	*过滤器应用场合
门卫、前台、秘书

过滤器简介

过滤器是一个用于拦截在数据源和数据目的地之间消息的一个对象
在这里插入图片描述

过滤器功能
分析请求,将请求发送给指定的资源或自己创建一个响应返回
在请求到达服务器端前处理请求,设置请求信息,将请求封装成符合规则的对象	
在响应到达客户端前处理响应,将响应封装成符合规则的对象

简述:     创建响应直接返回,包装请求转发,包装响应回复。
过滤器功能
• 身份验证过滤器(Authentication Filters)
• 数据压缩过滤器(Data compression Filters)
• 加密过滤器(Encryption Filters)
• 触发资源访问事件过滤器(Filters that trigger resource access events )
• 图像转换过滤器(Image Conversion Filters)
• 日志记录和审核过滤器(Logging and Auditing Filters)
• MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)
• 标记化过滤器(Tokenizing Filters)
• XSL/T 过滤器(XSL/T Filters),转换 XML 内容。

过滤器的执行

过滤器处理请求采取以下3种行动之一

1. 过滤器自身产生一个响应,返回给客户端
2. 把请求转发给过滤器链中的下一个过滤器,
	如果是最后一个过滤器则将请求转发给请求指定资源
3. 把请求转发到另一资源

过滤器示例

• AuthorityFilter
	– 编码(实现Filter接口)
	– 部署(在web.xml配置)
		• 注册过滤器
		• 配置虚拟路径
	– 运行

在这里插入图片描述

过滤器API

Filter接口

• init()方法
Servlet容器最先调用过滤器的init()方法,初始化过滤器,生命周期中只调用一次

• doFilter()方法
Servlet容器调用doFilter()方法处理请求

• destroy()方法
Servlet容器最后调用destroy()方法,释放过滤器所占的资源

过滤器相关接口、类

在这里插入图片描述

配置过滤器

配置Filter

在这里插入图片描述

举例:

在这里插入图片描述

Filter过滤器链

在这里插入图片描述

在这里插入图片描述

    <!-- 配置过滤器别名 -->
  <filter>
  	<filter-name>Filter11</filter-name>
  	<filter-class>net.lww.filter.Filter11</filter-class>
  	<!-- 添加过滤器的初始化参数 -->
  	<init-param>
  		<param-name>fParam1</param-name>
  		<param-value>fParam1Value</param-value>
  	</init-param>
  	<init-param>
  		<param-name>fParam2</param-name>
  		<param-value>fParam2Value</param-value>
  	</init-param>
  </filter>  
  <!-- 配置过滤器虚拟路径 -->
  <filter-mapping>
  	<filter-name>Filter11</filter-name>
  	<url-pattern> / * </url-pattern>
  </filter-mapping>
  
  
  
  
  
  

  <filter>
  	<filter-name>CharFilter</filter-name>
  	<filter-class>net.lww.filter.CharFilter</filter-class>
  </filter>
  
  <!-- 配置过滤器虚拟路径 -->
  <filter-mapping>
  	<filter-name>CharFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
• 拦截请求的顺序:
先处理xml上的,在处理注解的。
	– web.xml文件中配置的Filter的正序,		代码顺序
	– 注解配置的Filter的自然顺序,			字典排序


• 拦截响应的顺序:
	– 拦截请求的顺序的逆序

• 构造与初始化顺序:xml正序  +  注解倒叙。
	xml顺序不一定,来看情况。
	
• 销毁顺序与构造初始化顺序一致。

在这里插入图片描述

Filter注意事项

• Filter配置过滤器链
• Servlet容器可以对同一个过滤器对象运行多个线程来同时处理多个请求
@WebFilter(
		filterName = "Filter33",
		urlPatterns = "/*",
		initParams = {
				@WebInitParam(name = "fp1",value="fp1value"),
				@WebInitParam(name = "fp2",value="fp2value")
		}
		)
public class Filter33 implements Filter {
	private FilterConfig fConfig


	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {		
		System.out.println("Filter3.in");
		
		
		//获取初始化参数
		Enumeration<String> enums=fConfig.getInitParameterNames();
		while(enums.hasMoreElements()) {
			//得到当前初始化参数的名称与数值
			String pNameString=enums.nextElement();
			String pValueString=fConfig.getInitParameter(pNameString);
			System.out.println("		"+pNameString+"----"+pValueString);
		}
		chain.doFilter(request, response);
		System.out.println("Filter3.out");
	}

猜你喜欢

转载自blog.csdn.net/qq_44627608/article/details/106269716