更新時間:2022-02-07 11:44:51 來源:動力節點 瀏覽1577次
filter用于攔截用戶請求,在服務器作出響應前,可以在攔截后修改request和response,這樣實現很多開發者想得到的功能。
filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。
一個過濾器是一個可以傳送請求或修改響應的對象。過濾器并不是servlet,他們并不實際創建一個請求。他們是請求到達一個servlet前的預處理程序,和/或響應離開servlet后的后處理程序。一個過濾器能夠:
·在一個servlet被調用前截獲該調用
·在一個servlet被調用前檢查請求
·修改在實際請求中提供了可定制請求對象的請求頭和請求數據
·修改在實際響應中提供了可定制響應對象的響應頭和響應數據
·在一個servlet被調用之后截獲該調用
一個過濾器以作用于一個或一組servlet,零個或多個過濾器能過濾一個或多個servlet。一個過濾器需要實現java.servlet.Filter接口,并定義它的三個方法:
1. void init(FilterConfig config) throws ServletException:在過濾器執行service前被調用,以設置過濾器的配置對象。
2. void destroy();在過濾器執行service后被調用。
3. Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;執行實際的過濾工作。
服務器調用一次init(FilterConfig)以為服務準備過濾器,然后在請求需要使用過濾器的任何時候調用doFilter()。FilterConfig接口檢索過濾器名、初始化參數以及活動的servlet上下文。服務器調用destory()以指出過濾器已結束服務。過濾器的生命周期和servelt的生命周期非常相似 ——在Servlet API 2.3 最終發布稿2號 中最近改變的。先前得用setFilterConfig(FilterConfig)方法來設置生命周期。
在doFilter()方法中,每個過濾器都接受當前的請求和響應,而FilterChain包含的過濾器則仍然必須被處理。doFilter()方法中,過濾器可以對請求和響應做它想做的一切。(就如我將在后面討論的那樣,通過調用他們的方法收集數據,或者給對象添加新的行為。)過濾器調用
chain.doFilter()將控制權傳送給下一個過濾器。當這個調用返回后,過濾器可以在它的doFilter()方法的最后對響應做些其他的工作;例如,它能記錄響應的信息。如果過濾器想要終止請求的處理或得對響應的完全控制,則他可以不調用下一個過濾器。
處理全站中文亂碼問題
實現自動登錄
過濾敏感詞匯
壓縮網頁
選擇性讓瀏覽器緩存
這幾種功能的實現采用同樣的原理,那就是使用包裝模式或動態代理增強request或response對象的功能。
1,servlet 流程是短的,url傳來之后,就對其進行處理,之后返回或轉向到某一自己指定的頁面。它主要用來在 業務處理之前進行控制.
2,filter 流程是線性的, url傳來之后,檢查之后,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而servlet 處理之后,不會繼續向下傳遞。filter功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。
filter可用來進行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等。
步驟一:新建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="發表評論" />
</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();
//獲取評論內容
String str = request.getParameter("comment");
//顯示評論內容
out.println("<h3>評論內容:" + 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;
/**
* 容器刪除過濾器實例之前調用,只執行一次
*/
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>評論內容已關閉</h3>");
}else{
//沒有敏感詞匯則向后處理,交給其他過濾器或Servlet
chain.doFilter(req, resp);
}
}
/**
* 容器啟動之后,創建過濾器實例
* 然后調用init方法,只會調用一次
* 容器會將已經創建好的FilterConfig對象作為參數傳入
* 可以從該參數中獲取初始化的配置信息
*/
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>
步驟五:部署應用,輸入評論查看結果
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習