Filter简介

过虑器基础

在web项目中就只有三大组件:
Filter过虑器
监听器.
Servlet
在web中过虑器就是一个类javax.servlet.Filter。
过虑器是用于在执行时,过虑用户的请求(request),或是过虑从请求的资源中返回的响应(response).




实现一个最基本的过虑器

1:过虑器只对url(路径)进行过虑。
2:过虑器开发人员来实现。
3:过虑器由于是web的核心组,所以这个filter的实现者也必须要配置到web.xml中。
4:三个生命周期方法:init,destory,doFilter(执行过虑任务)。用户的每次请求,都会执行doFIlter方法,而
Init,destory只会执行一次。
Init方法执行的时间:在项目启动时,直接初始化Filter的对象,所以会在tomcat启动时执行init方法。

第一步:书写一个类实现Filter接口

public class OneFilter implements Filter{

	public void destroy() {
		System.err.println("过滤器dead"+this);
	}
	//此方法执行过虑任务
	/**
	 * 第三个参数是指过虑器链:
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.err.println("正在执行过滤"+this+"request :"+request);
//		执行这句话,就是放行,不执行就是阻止
		chain.doFilter(request, response);
	}
	//此方法只会在tomcat在启动时执行一次
	public void init(FilterConfig filterConfig) throws ServletException {
		System.err.println("过滤器初始化了"+this);
	}

}


第二步:在web.xml中配置这个过虑器

 <!-- 配置filter的类 -->
  <filter>
  <filter-name>one</filter-name>
  <filter-class>com.jiangyi.filter.OneFilter</filter-class>
  </filter>
<!--   配置这个过虑器对哪一个url进行过虑 -->
<filter-mapping>
<filter-name>one</filter-name>
<url-pattern>/one</url-pattern>
</filter-mapping>

此url不是filter的请求url,是说明拦截哪一个url.这个url是其他servlet或是jsp的url.


filter的filter-mapping中的url-pattern的设置

url-pattern的设置:
/* = 对所有url都请求这个servlet。| 都被这个filter过虑.
/ = 只可以给servlet 不可以给过滤器。 - 所有其他的servlet不处理的url都由这个url所指定的servlet处理。默认servlet。
*.jspx = 所有以jspx结束都请求到这个Servlet或是被某个Filter拦截。如http://local:8080/proj/abc.jspx
/jsps/* = 所有路径中以/jsps/开头的都请求到这个servlet或是被某个filter拦截到。
/jsps/*.jspx 错误的:SUN规定*两边不可以同时出现字符。
<filter-mapping>
  	<filter-name>one</filter-name>
  	<!-- 对所有url都拦截过虑任务 -->
  	<url-pattern>/index.jsp</url-pattern>
  	<url-pattern>/jsps/*</url-pattern>
  	<!-- 拦截这个servlet上的所有url设置 -->
 	<servlet-name>OneSerlvet</servlet-name>
  </filter-mapping>

、过虑器中的其他配置

如果有jsps/abc.jsp这个页面,则显示这个页面有两种方式:
1:在地址栏请求:http://local:8080/project/jsps/abc.jsp -- 可以被拦截到的,因为:路径符合/jsp/abc.jsp
2:req.getRequestDispathcer(“/jsps/abc.jsp”).forward(req,resp); -
Dipatcher属性:
Request – 默认值,只拦截用户的新的请求。
Forward – 对转发进行拦截。
Include – 对include拦截。
Error - 对错误进行拦截。
<!-- 设置对转发拦截 -->
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
如果配置了其他设置一定要配置request 否则request就不会拦截了

、配置过虑器的初始化参数

在filter类中有一个方法:init(FilterConfig config); 而filtetrConfig中包含了从web.xml中读取初始化参数值。

<filter>
		<filter-name>one</filter-name>
		<filter-class>com.jiangyi.filter.OneFilter</filter-class>
		<init-param>
			<param-name>name</param-name>
			<param-value>张三Jack</param-value>
		</init-param>
		<init-param>
			<param-name>age</param-name>
			<param-value>88</param-value>
		</init-param>
	</filter>

在filter类中获取值:
private FilterConfig filterConfig;
	//此方法只会在tomcat在启动时执行一次
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig=filterConfig;
		System.err.println("过滤器初始化了"+this);
		
		//获取name的值:
		String name=filterConfig.getInitParameter("name");
		System.err.println("name is:"+name);
		System.err.println("----------------------------");
		Enumeration<String> en= filterConfig.getInitParameterNames();
		while (en.hasMoreElements()) {
			String paramName = en.nextElement();
			String val=filterConfig.getInitParameter(paramName);
			System.err.println(paramName+"="+val);
		}
	}

过虑器链FilterChain


当一个web项目中有多个连接器,
且这些过虑器对同个url进行过虑。这时就形成了过虑器链/


但是实现了一个SingleThreadMode1 每个servlet等就不是单例的

在filter的配置当中,有两个配置:filter,filter-mapping.
Filter-mapping在前,则先执行,在后则后执行。

<filter>
  	<filter-name>first</filter-name>
  	<filter-class>cn.jiangyi.filter.FirstFilter</filter-class>
  </filter>
    <filter>
  	<filter-name>second</filter-name>
  	<filter-class>cn.jiangyi.filter.SecondFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>second</filter-name>
  	<url-pattern>/four</url-pattern>
  </filter-mapping>
   <filter-mapping>
  	<filter-name>first</filter-name>
  	<url-pattern>/four</url-pattern>
  </filter-mapping>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值