Servlet过滤器

来源:互联网 发布:ubuntu安装语言支持 编辑:程序博客网 时间:2024/05/19 09:02
Filter(过滤器)是 Servlet 规范 2.3 中新增的技术,它的基本功能就是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能。
   

1. Filter 简介:
<1> 在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig。
<2> Filter 程序是一个实现了 Filter 接口的 Java 类,与 Servlet 程序相似,它由 Servlet 容器进行调用和执行。
<3> Filter 程序需要在 web.xml 文件中进行注册和设置它所能拦截的资源:Filter 程序可以拦截 Jsp, Servlet, 静态图片文件和静态 html 文件。


2.Filter 的基本工作原理:
<1> 当在 web.xml 中注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,这个 Filter 就成了 Servlet 容器与该 Servlet 程序的通信线路上的一道关卡,该 Filter 可以对 Servlet 容器发送给Servlet 程序的请求和 Servlet 程序回送给 Servlet 容器的相应进行拦截,可以决定是否将请求继续传递给 Servlet 程序,以及对请求和相应信息是否进行修改。
<2> 在一个 web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以对一个或一组 Servlet 程序进行拦截。
<3> 若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。


3. 过滤器的部署:
在实现一个过滤器后,需要在 web.xml 中进行注册和设置它所能拦截的资源。这可以通过<filter>和<filter-mapping>元素来完成的。
<1> Filter 元素(注册Filter):<filter>元素用于在Web应用程序中注册一个过滤器。
下面是在 web.xml 文件中注册 Filter 的代码示例:
<filter>

<filter-name>testFitler</filter-name>
<filter-class>cn.itcast.TestFiter</filter-class>
<init-param>
<param-name>paramName</param-name>
<param-value>paramValue</param-value>
</init-param>

</filter>
<2> 映射 Filter : <filter-mapping> 元素用于设置一个 Filter 所负责拦截的资源。一个 Filter 拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径( url样式)。
下面是在 web.xml 文件中映射 Filter 的代码示例:
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>

</filter-mapping>


4. 下面是 Filter 过滤器的一个典型应用,通过这个应用我们能对 Filter 有更深入的理解和掌握。
<1> 编写一个过滤器 NameFilter , 完成以下功能:过滤表单的 name, 若 name 和 filter 中配置的初始化参数一致则将请求传给 hello.jsp(给出提示信息: Hello: xxx), 若不匹配则返回给 index.jsp 页面并给出提示信息(例如: name 不匹配,给出 “用户名错误”)
① 在login.jsp 登陆页面的代码如下:
${requestScope.errorInfo }

<form action="hello.jsp" method="post">

name: <input type="text" name="name" />

<input type="submit" value="submit" />

</form>
② 在实现了 Filter 接口的 doFilter 方法中的代码如下:
//1. 获取表单参数
String name = arg0.getParameter("name");

//2. 获取过滤器初始化参数
String filterName = filterConfig.getInitParameter("filterName");

//3. 进行比对
//3.1 如果一致,则放行
if(name != null && name.equals(filterName)) {
arg2.doFilter(arg0, arg1);
} else {
//3.2 如不一致则返回(转发) login.jsp 页面,并给出提示信息“用户名错误”此处需要

转发,因为我们要把request传回去
arg0.setAttribute("errorInfo", "用户名错误,请重新输入!");
arg0.getRequestDispatcher("login.jsp").forward(arg0, arg1);