学科分类
目录
Java Web

Filter映射

通过上一小节的学习,了解到Filter拦截的资源需要在web.xml文件中进行配置,即Filter映射。Filter的映射方式可分为两种,具体如下:

1、使用通配符“\”拦截用户所有请求

Filter的<filter-mapping>元素可以配置过滤器所有拦截的资源,如果想让过滤器拦截所有的请求访问,那么需要使用通配符“*”来实现,具体示例如下:

<filter>

<filter-name>Filter1</filter-name>

<filter-class>cn.itcast.chapter04.filter.MyFilter </filter-class>

</filter>

<filter-mapping>

  <filter-name>Filter1</filter-name>

  <url-pattern>/*</url-pattern>

</filter-mapping>

2、拦截不同方式的访问请求

在web.xml文件中,一个<filter-mapping>元素用于配置一个Filter所负责拦截的资源。 <filter-mapping>元素中有一个特殊的子元素<dispatcher>,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式,<dispatcher>元素的值共有四个,具体如下:

● REQUEST

当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器将不会被调用。

● INCLUDE

如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

● FORWARD

如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

● ERROR

如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

为了大家更好地理解上述四个值的作用,接下来以FORWARD为例,分步骤演示Filter对转发请求的拦截效果,具体如下:

(1)在chapter04工程的cn.itcast.chapter04. filter包中,创建一个ServletTest.java程序,该程序用于将请求转发给first.jsp页面,如例1所示。

例1 ServletTest.java

 1  package cn.itcast.chapter04.filter;

 2  import java.io.*;

 3  import javax.servlet.*;

 4  import javax.servlet.http.*;

 5  public class ServletTest extends HttpServlet {

 6    public void doGet(HttpServletRequest request, HttpServletResponse

 7        response) throws ServletException, IOException {

 8      request.getRequestDispatcher("/first.jsp")

 9           .forward(request, response);

 10   }

 11   public void doPost(HttpServletRequest request, HttpServletResponse 

 12        response) throws ServletException, IOException {

 13     doGet(request, response);

 14   }

 15 }

(2)在chapter04工程的WebContent目录中创建一个first.jsp页面,该页面用于输出内容,如例2所示。

例2 first.jsp

 1  <%@ page language="java" contentType="text/html; charset=utf-8"

 2  pageEncoding="utf-8"%>

 3  <html>

 4  <head></head>

 5  <body>

 6    first.jsp

 7  </body>

 8  </html>

(3)在chapter04工程的cn.itcast.chapter04.filter包中,创建一个FilterTest.java程序,专门用于拦截first.jsp页面,如例3所示。

例3 FilterTest.java

 1  package cn.itcast.chapter04.filter;

 2  import java.io.*;

 3  import javax.servlet.*;

 4  public class FilterTest implements Filter {

 5    public void destroy() {

 6      // 过滤器对象在销毁时自动调用,释放资源

 7    }

 8    public void doFilter(ServletRequest request, ServletResponse response,

 9        FilterChain chain) throws IOException, ServletException {

 10     // 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用

 11     PrintWriter out=response.getWriter();

 12     out.write("Hello FilterTest");

 13   }

 14   public void init(FilterConfig fConfig) throws ServletException {

 15     // 过滤器对象在初始化时调用,可以配置一些初始化参数

 16    }

 17 }

(4)在web.xml文件中,配置Filter过滤器,拦截first.jsp页面,具体代码如下:

<filter>

  <filter-name>FilterTest</filter-name>

  <filter-class>cn.itcast.chapter04.filter.FilterTest</filter-class>

 </filter>

 <filter-mapping>

  <filter-name>FilterTest</filter-name>

  <url-pattern>/first.jsp</url-pattern>

 </filter-mapping>

(5)启动Tomcat服务器,在浏览器中输入URL地址http://localhost:8080/chapter04/ServletTest访问ServletTest,浏览器显示的结果如图1所示。

图1 运行结果

从图1中可以看出,浏览器可以正常访问JSP页面,说明FilterTest没有拦截到ServletTest转发的first.jsp页面。

(6)为了拦截ServletTest通过forward()方法转发的first.jsp页面,需要在web.xml文件中的增加一个<dispatcher>元素,将该元素的值设置为FORWARD,修改后的FilterTest的映射如下所示:

<filter>

  <filter-name>FilterTest</filter-name>

  <filter-class>cn.itcast.chapter04.filter.FilterTest</filter-class>

 </filter>

 <filter-mapping>

  <filter-name>FilterTest</filter-name>

  <url-pattern>/first.jsp</url-pattern>

  <dispatcher>FORWARD</dispatcher>

 </filter-mapping>

(7)启动Tomcat服务器,在浏览器的地址拦输入URL地址http://localhost:8080/chapter04/ServletTest访问ServletTest,浏览器显示的结果如图2所示。

图2 运行结果

从图2中可以看出,浏览器窗口显示的是FilterTest中的内容,而first.jsp页面的输出内容没有显示。由此可见,ServletTest中通过forward()方法转发的first.jsp页面被成功拦截了。

点击此处
隐藏目录