更新時(shí)間:2020年09月18日14時(shí)23分 來源:傳智播客 瀏覽次數(shù):
Filter攔截的資源需要在web.xml文件中進(jìn)行配置,即Filter映射。Filter的映射方式可分為兩種,具體如下:
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>
在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所示。
從圖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所示。
從圖2中可以看出,瀏覽器窗口顯示的是FilterTest中的內(nèi)容,而first.jsp頁面的輸出內(nèi)容沒有顯示。由此可見,ServletTest中通過forward()方法轉(zhuǎn)發(fā)的first.jsp頁面被成功攔截了。
猜你喜歡:
北京校區(qū)