教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

filter映射:filter的兩種映射方式

更新時(shí)間:2020年09月18日14時(shí)23分 來源:傳智播客 瀏覽次數(shù):

Filter攔截的資源需要在web.xml文件中進(jìn)行配置,即Filter映射。Filter的映射方式可分為兩種,具體如下:

1、使用通配符“\”攔截用戶所有請(qǐng)求

Filter的元素可以配置過濾器所有攔截的資源,如果想讓過濾器攔截所有的請(qǐng)求訪問,那么需要使用通配符“*”來實(shí)現(xiàn),具體示例如下:

<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、攔截不同方式的訪問請(qǐng)求

在web.xml文件中,一個(gè)元素用于配置一個(gè)Filter所負(fù)責(zé)攔截的資源。 元素中有一個(gè)特殊的子元素,該元素用于指定過濾器所攔截的資源被Servlet容器調(diào)用的方式,元素的值共有四個(gè),具體如下:

● REQUEST

當(dāng)用戶直接訪問頁面時(shí),Web容器將會(huì)調(diào)用過濾器。如果目標(biāo)資源是通過RequestDispatcher的include()或forward()方法訪問時(shí),那么該過濾器將不會(huì)被調(diào)用。

● INCLUDE

如果目標(biāo)資源是通過RequestDispatcher的include()方法訪問時(shí),那么該過濾器將被調(diào)用。除此之外,該過濾器不會(huì)被調(diào)用。

● FORWARD

如果目標(biāo)資源是通過RequestDispatcher的forward()方法訪問時(shí),那么該過濾器將被調(diào)用。除此之外,該過濾器不會(huì)被調(diào)用。

● ERROR

如果目標(biāo)資源是通過聲明式異常處理機(jī)制調(diào)用時(shí),那么該過濾器將被調(diào)用。除此之外,過濾器不會(huì)被調(diào)用。

為了大家更好地理解上述四個(gè)值的作用,接下來以FORWARD為例,分步驟演示Filter對(duì)轉(zhuǎn)發(fā)請(qǐng)求的攔截效果,具體如下:

(1)在chapter04工程的cn.itcast.chapter04. filter包中,創(chuàng)建一個(gè)ServletTest.java程序,該程序用于將請(qǐng)求轉(zhuǎn)發(fā)給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目錄中創(chuàng)建一個(gè)first.jsp頁面,該頁面用于輸出內(nèi)容,如例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包中,創(chuàng)建一個(gè)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      // 過濾器對(duì)象在銷毀時(shí)自動(dòng)調(diào)用,釋放資源

 7    }

 8    public void doFilter(ServletRequest request, ServletResponse response,

 9        FilterChain chain) throws IOException, ServletException {

 10     // 用于攔截用戶的請(qǐng)求,如果和當(dāng)前過濾器的攔截路徑匹配,該方法會(huì)被調(diào)用

 11     PrintWriter out=response.getWriter();

 12     out.write("Hello FilterTest");

 13   }

 14   public void init(FilterConfig fConfig) throws ServletException {

 15     // 過濾器對(duì)象在初始化時(shí)調(diào)用,可以配置一些初始化參數(shù)

 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)啟動(dòng)Tomcat服務(wù)器,在瀏覽器中輸入U(xiǎn)RL地址http://localhost:8080/chapter04/ServletTest訪問ServletTest,瀏覽器顯示的結(jié)果如圖1所示。

結(jié)果01


從圖1中可以看出,瀏覽器可以正常訪問JSP頁面,說明FilterTest沒有攔截到ServletTest轉(zhuǎn)發(fā)的first.jsp頁面。

(6)為了攔截ServletTest通過forward()方法轉(zhuǎn)發(fā)的first.jsp頁面,需要在web.xml文件中的增加一個(gè)元素,將該元素的值設(shè)置為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)啟動(dòng)Tomcat服務(wù)器,在瀏覽器的地址攔輸入U(xiǎn)RL地址http://localhost:8080/chapter04/ServletTest訪問ServletTest,瀏覽器顯示的結(jié)果如圖2所示。

運(yùn)行結(jié)果02


從圖2中可以看出,瀏覽器窗口顯示的是FilterTest中的內(nèi)容,而first.jsp頁面的輸出內(nèi)容沒有顯示。由此可見,ServletTest中通過forward()方法轉(zhuǎn)發(fā)的first.jsp頁面被成功攔截了。


猜你喜歡:

什么是filter?filter是用來做什么的?

filter的執(zhí)行順序是怎樣的?

Java培訓(xùn)實(shí)戰(zhàn)教程之淺談過濾器Filter

java高級(jí)軟件工程師課程

0 分享到:
和我們?cè)诰€交談!