JavaWeb的Servlet,Filter过滤器

一、学习目标
1、Filter过滤器
2、Filter映射
3、Filter链
二、重点知识
为了获取Filter程序在web.xml文件中的配置信息,Servlet API提供了一个FilterConfig接口,该接口封装了Filter程序在web.xml中的所有注册信息,并且提供了一系列获取这些配置信息的方法 。
1、Filter过滤器
Filter被称作为过滤器,其基本功能就是对Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。这好比我们生活中所用到的净水器一样,他可以看做一个过滤器,专门来过滤杂质,Filter在web应用中的拦截过程如下图所示:
在这里插入图片描述
当浏览器访问服务器中的目标资源中,会被Filter拦截,在Filter中进行预处理,然后再将请求转发给目标资源。当服务器接收到这个请求会对其进行响应,在服务器处理响应的过程中,也需要将响应结果发送给过滤器,在过滤器中对响应结果进行处理后,才会发送给客户端。
1.1Filter映射
1.1.1 拦截不同方式的访问请求
在web.xml文件中,一(个ilter-mapping>元素用于配置一个Fller 所负责拦数的资源。元素中有一个特殊的子元素<dispatcher,该元素用于指定过滤器所拦数的资源被Servlet容器调用的方式,<dispatcher 元素的值共有4个,具体如下。
(1)REQUEST
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问的,那么该过滤器将不会被调用。
(2)INCLUDE
如果目标资源是通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
(3)FORWARD
如果目标资源是通过RequsDispatcler的foward)方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
(4)ERROR !
如果目标资源是通过声明式异常处理机制调用的,那么该过滤器将被调用。除此之外,过滤器不会被调用。
为了更好地理解上述4个值的作用,接下来以FORWARD为例,分步骤演示Filter对转发请求的拦截效果。
在一个web应用程序可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截。如果多个Filter程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链(也叫做过滤链)。Filter链用FilterChain对象来表示,FilterChain对象中有一个doFilter()方法,该方法的作用就是让Filter链上的当前过滤器放行,使请求进入下一个Filter,接下来通过一个图例来描述Filter链的链接过程。
3、Filter链
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为一个Filter链,web服务器根据Filter在web.xml文件中的注册顺序< mapping >,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法.在doFilter方法中,开发人员如果调用了FilterChain对象doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第二个filter,如果没有,则调用目标资源。
三、实际运用
1.实现第一个Filter程序:
为了快速了解Filter的开发过程,接下来,分布实现一个Filter程序,演示Filter程序如何对Servlet程序的调用过程进行拦截,步骤如下:
1)创建一个web项目,在该项目的src目录下创建一个包,在该包下创一个名为MyServlet的类Servlet类,该类用于访问时在浏览器输出“你的内容”。
代码示例:

package cn.itcast.chapter009.filter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class myServlet
 */
public class MyServlet extends HttpServlet {
   
	private static final long serialVersionUID = 1L;
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
   
		response.getWriter().write("dahsuju2003");;
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
   
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

2)在web.xml文件对Servlet进行配置:

 <servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>cn.itcast.chapter009.filter.MyServlett</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
  </servlet-mapping>

3)在cn.itcast.chapter08.filter包中创建一个MyFilter的Filter类,该类用于拦截MyFilter的Filter类,该类用于拦截MyServlet程序。代码示例:

package cn.itcast.chapter009.filter;
import java.io.*;
import javax.servlet.Filter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
/**
 * Servlet implementation class MyFilter
 */
@WebServlet("/MyFilter")
public class MyFilter extends HttpServlet {
   
	private static final long serialVersionUID = 1L;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值