更新時間:2022-02-07 11:44:51 來源:動力節(jié)點 瀏覽1702次
filter用于攔截用戶請求,在服務(wù)器作出響應(yīng)前,可以在攔截后修改request和response,這樣實現(xiàn)很多開發(fā)者想得到的功能。
filter是一個可以復(fù)用的代碼片段,可以用來轉(zhuǎn)換HTTP請求、響應(yīng)和頭信息。Filter不像Servlet,它不能產(chǎn)生一個請求或者響應(yīng),它只是修改對某一資源的請求,或者修改從某一的響應(yīng)。
一個過濾器是一個可以傳送請求或修改響應(yīng)的對象。過濾器并不是servlet,他們并不實際創(chuàng)建一個請求。他們是請求到達(dá)一個servlet前的預(yù)處理程序,和/或響應(yīng)離開servlet后的后處理程序。一個過濾器能夠:
·在一個servlet被調(diào)用前截獲該調(diào)用
·在一個servlet被調(diào)用前檢查請求
·修改在實際請求中提供了可定制請求對象的請求頭和請求數(shù)據(jù)
·修改在實際響應(yīng)中提供了可定制響應(yīng)對象的響應(yīng)頭和響應(yīng)數(shù)據(jù)
·在一個servlet被調(diào)用之后截獲該調(diào)用
一個過濾器以作用于一個或一組servlet,零個或多個過濾器能過濾一個或多個servlet。一個過濾器需要實現(xiàn)java.servlet.Filter接口,并定義它的三個方法:
1. void init(FilterConfig config) throws ServletException:在過濾器執(zhí)行service前被調(diào)用,以設(shè)置過濾器的配置對象。
2. void destroy();在過濾器執(zhí)行service后被調(diào)用。
3. Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;執(zhí)行實際的過濾工作。
服務(wù)器調(diào)用一次init(FilterConfig)以為服務(wù)準(zhǔn)備過濾器,然后在請求需要使用過濾器的任何時候調(diào)用doFilter()。FilterConfig接口檢索過濾器名、初始化參數(shù)以及活動的servlet上下文。服務(wù)器調(diào)用destory()以指出過濾器已結(jié)束服務(wù)。過濾器的生命周期和servelt的生命周期非常相似 ——在Servlet API 2.3 最終發(fā)布稿2號 中最近改變的。先前得用setFilterConfig(FilterConfig)方法來設(shè)置生命周期。
在doFilter()方法中,每個過濾器都接受當(dāng)前的請求和響應(yīng),而FilterChain包含的過濾器則仍然必須被處理。doFilter()方法中,過濾器可以對請求和響應(yīng)做它想做的一切。(就如我將在后面討論的那樣,通過調(diào)用他們的方法收集數(shù)據(jù),或者給對象添加新的行為。)過濾器調(diào)用
chain.doFilter()將控制權(quán)傳送給下一個過濾器。當(dāng)這個調(diào)用返回后,過濾器可以在它的doFilter()方法的最后對響應(yīng)做些其他的工作;例如,它能記錄響應(yīng)的信息。如果過濾器想要終止請求的處理或得對響應(yīng)的完全控制,則他可以不調(diào)用下一個過濾器。
處理全站中文亂碼問題
實現(xiàn)自動登錄
過濾敏感詞匯
壓縮網(wǎng)頁
選擇性讓瀏覽器緩存
這幾種功能的實現(xiàn)采用同樣的原理,那就是使用包裝模式或動態(tài)代理增強(qiáng)request或response對象的功能。
1,servlet 流程是短的,url傳來之后,就對其進(jìn)行處理,之后返回或轉(zhuǎn)向到某一自己指定的頁面。它主要用來在 業(yè)務(wù)處理之前進(jìn)行控制.
2,filter 流程是線性的, url傳來之后,檢查之后,可保持原來的流程繼續(xù)向下執(zhí)行,被下一個filter, servlet接收等,而servlet 處理之后,不會繼續(xù)向下傳遞。filter功能可用來保持流程繼續(xù)按照原來的方式進(jìn)行下去,或者主導(dǎo)流程,而servlet的功能主要用來主導(dǎo)流程。
filter可用來進(jìn)行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等。
步驟一:新建comment.jsp頁面
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>評論</title>
</head>
<body>
<form action="comment" method="post">
<fieldset>
<legend>評論</legend>
請輸入評論:<textarea name="comment"
style="vertical-align:middle;
width:140px;height:55px"></textarea><Br>
<input type="submit" value="發(fā)表評論" />
</fieldset>
</form>
</body>
</html>
步驟二:新建CommentServlet.java文件
package web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CommentServlet extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//獲取評論內(nèi)容
String str = request.getParameter("comment");
//顯示評論內(nèi)容
out.println("<h3>評論內(nèi)容:" + str + "</h3>");
out.close();
}
}
步驟三:新建CommentFilter類
package web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CommentFilter1 implements Filter{
private String illegalWord;
/**
* 容器刪除過濾器實例之前調(diào)用,只執(zhí)行一次
*/
public void destroy() {
}
/**
* 用于處理請求的主要方法
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
String comment = req.getParameter("comment");
if(comment.indexOf("damn")!=-1){
//有敏感詞匯
out.print("<h3>評論內(nèi)容已關(guān)閉</h3>");
}else{
//沒有敏感詞匯則向后處理,交給其他過濾器或Servlet
chain.doFilter(req, resp);
}
}
/**
* 容器啟動之后,創(chuàng)建過濾器實例
* 然后調(diào)用init方法,只會調(diào)用一次
* 容器會將已經(jīng)創(chuàng)建好的FilterConfig對象作為參數(shù)傳入
* 可以從該參數(shù)中獲取初始化的配置信息
*/
public void init(FilterConfig filterConfig) throws ServletException {
illegalWord = filterConfig.getInitParameter("illegalWord");
System.out.println("Filter1:init is runnming... " + illegalWord);
}
}
步驟四:配置CommentFilter過濾器
web.xml文件代碼:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<!-- 過濾器 -->
<filter>
<filter-name>filter1</filter-name>
<filter-class>web.CommentFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/comment</url-pattern>
</filter-mapping>
<!-- Servlet -->
<servlet>
<servlet-name>CommentServlet</servlet-name>
<servlet-class>web.CommentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CommentServlet</servlet-name>
<url-pattern>/comment</url-pattern>
</servlet-mapping>
</web-app>
步驟五:部署應(yīng)用,輸入評論查看結(jié)果
初級 202925
初級 203221
初級 202629
初級 203743