1. 程式人生 > >servlet-filter

servlet-filter

1. 過濾器

問題:設定解碼字符集時,以下的程式碼出現在了多處servlet中,
要求:希望避免出現重複程式碼
request.setCharacterEncoding("utf-8");

2. 概念

Filter  過濾器
可以對請求(響應)進行過濾

請求 --> 過濾器1 --> 過濾器2 --> .... --> 過濾器n --> 目的地(Servlet, jsp)

3. 編寫過濾器的步驟

1. 實現Filter介面
2. 在類上新增@WebFilter(urlPattern="要過濾的目標路徑")
3. 在doFilter方法中控制請求是否前進到下一個過濾器

filterChain.doFilter(request, response); // 呼叫此方法,表示請求繼續前進,不呼叫,請求就停止不前了


4. 匹配路徑的三種寫法

1) 精確匹配:目標路徑是過濾器路徑就是什麼
例如: /s1  /s2 ...
2) 字首匹配:
例如:有兩個servlet,路徑分別是 /user/s1, /user/s2
過濾器的匹配路徑就可以寫為: /user/ *

/ * 表示匹配此應用程式中所有路徑


3) 字尾匹配:

*.字尾

注意: 字尾匹配不要以/開頭, 精確匹配和字首匹配需要以/開頭

*.jsp 表示在請求到達所有jsp之前,經過此過濾器


5. 多個過濾器

使用@WebFilter去控制匹配路徑時,多個過濾器都匹配目標,執行順序和過濾器類名有關。

按類名的字母順序排序

6. 過濾器的應用


應用1: 字元編碼過濾器
        在過濾器中統一呼叫 request.setCharacterEncoding方法
應用2: 登入檢查

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession session = request.getSession();
// 檢查是否有登入標記
if(session.getAttribute("isLogin") == null) { // 如果沒有找到
    request.getRequestDispatcher("/login.jsp").forward(request, servletResponse);
    return;
} else { // 找到登入標記, 放行請求,讓請求繼續前進
    filterChain.doFilter(request, servletResponse);
}

應用3: 自動登入
1) 過濾器
2) cookie (把使用者名稱和密碼的資訊記錄在cookie)

7. 密碼的加密處理
雜湊技術(簽名技術)
明文    密文
123456 ==> e10adc3949ba59abbe56e057f20f883e
md5 演算法    16位元組
sha256 演算法

特點1:運算不可逆
特點2:運算的結果長度固定
特點3:原始內容一樣,運算的結果是一樣的

8. jsp 隱式物件(9個)

config      jsp的配置資訊
page        jsp自身物件(this)
exception   異常物件(isErrorPage=true)

response 響應
out      響應字元流

pageContext 頁面作用域
request     請求作用域 變數型別 HttpServletRequest
session     會話作用域 (同一個客戶端的多次請求)  HttpSession
application 應用作用域 變數型別 ServletContext (上下文)

    他們都有如下方法
    .setAttribute("名", 值);   // 設定
    Object 值 = .getAttribute("名"); // 獲取
    Object 值 = .removeAttribute("名"); // 刪除

作用域(Scope)

<%// 向page作用域存入內容
//    pageContext.setAttribute("name", "張三"); // 同一頁面中的資訊
    request.setAttribute("name", "李四");    // 一次請求有效的資訊(例如servlet存入結果,jsp獲取結果)
    session.setAttribute("name", "王五"); // 每個使用者(瀏覽器)獨有的資訊(例如購物車資訊)
    application.setAttribute("name", "趙六"); // 適合放全域性資訊(城市資訊, 類別資訊)
    %>

    <!-- 從page作用域獲取內容-->
    <%= pageContext.getAttribute("name")%>
    <!--  從page作用域獲取內容(推薦) -->
    ${pageScope.name}

    <!-- 從request作用域取-->
    <%= request.getAttribute("name")%>
    <!-- 從request作用域取(推薦)-->
    ${requestScope.name}

    <!-- 從session作用域取值 -->
    <%= session.getAttribute("name")%>
    <!-- 從session作用域取值(推薦) -->
    ${sessionScope.name}

    <!-- 從application作用域取值 -->
    <%= application.getAttribute("name")%>
    <!-- 從application作用域取值(推薦) -->
    ${applicationScope.name}

    <hr/>
    <!-- 在el表示式取作用域變數時,不加字首,先搜尋pageScope, 再搜尋requestScope, 繼續搜尋sessionScope, 再搜尋applicationScope-->
    ${name}

9. el表示式中的隱式物件
11個

pageScope           page作用域   型別是map集合
requestScope    request作用域 型別是map集合
sessionScope    會話作用域    型別是map集合
applicationScope 應用作用域   型別是map集合

param           代表所有請求引數集合 型別是map集合
paramValues      代表所有請求引數集合(用來獲取多值引數)

cookie           代表請求中所有的cookie集合 map型別 
                key是cookie的name, value是cookie物件(name,value)

header         獲取請求頭的內容 型別是map集合f
                 key是請求頭中key的名稱
headerValues    獲取請求頭的內容(用來獲取多值)
initParam      每個jsp可以配置一個初始化引數
    initParam.key
pageContext