JavaWeb过滤器

本文详细介绍了JavaWeb中的过滤器(Filter)概念、生命周期、FilterConfig、FilterChain及不同拦截方式。过滤器用于拦截请求,决定是否执行目标Servlet。文章通过案例展示了过滤器的配置、执行顺序和应用场景,强调了在直接访问、转发、包含和错误处理四种拦截方式中的应用。
摘要由CSDN通过智能技术生成

1、过滤器概述


  过滤器是JavaWeb三大组件之一,与Servlet很相似,不它过滤器是用来拦截请求的,而不是处理请求的。当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。

  其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。



2、过滤器小案例


  其实过滤器与Servlet很相似,可以仿照Servlet应用,写一个类,实现Filter接口:

<span style="font-size:18px;">public class HelloFilter implements Filter {
	public void init(FilterConfig filterConfig) throws ServletException {}
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("Hello Filter");
	}
	public void destroy() {}
}</span>

  

  第二步也与Servlet一样,在web.xml文件中部署Filter:

<span style="font-size:18px;">  <filter>
  	<filter-name>helloFilter</filter-name>
  	<filter-class>cn.itcast.filter.HelloFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>helloFilter</filter-name>
  	<url-pattern>/index.jsp</url-pattern>
  </filter-mapping></span>


  效果:当用户访问index.jsp页面时,会执行HelloFilter的doFilter()方法,在我们的示例中,index.jsp页面是不会被执行的,如果想执行index.jsp页面,那么我们需要放行:

<span style="font-size:18px;">	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("filter start...");
		chain.doFilter(request, response);
		System.out.println("filter end...");
	}</span>


  不要错误的认为,一个请求在给客户端输出之后就算是结束了,这是不对的!其实很多事情都需要在给客户端响应之后才能完成。


3、过滤器详细


  (1)过滤器的生命周期


    和Servlet的生命周期也是相当类似的:

       init(FilterConfig):在服务器启动时会创建Filter实例,并且每个类型的Filter只创建一个实例,从此不再创建!在创建完Filter实例后,会马上调用init()方法完成初始化工作,这个方法只会被执行一次;

       doFilter(ServletRequest req,ServletResponse res,FilterChain chain):这个方法会在用户每次访问“目标资源(<url->pattern>index.jsp</url-pattern>)”时执行,如果需要“放行”,那么需要调用FilterChain的doFilter(ServletRequest,ServletResponse)方法,如果不调用FilterChain的doFilter()方法,那么目标资源将无法执行;

       

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值