1. 程式人生 > >Filter過濾器與Session會話跟蹤技術

Filter過濾器與Session會話跟蹤技術

用戶訪問 所有 ets SQ div pub 機制 net row

Filter過濾器

適用場景

1.為web應用程序的新功能建立模型(可被添加到web應用程序中或者從web應用程序中刪除而不需要重寫基層應用程序代碼)
2.用戶授權Filter:負責檢查用戶請求,根據請求過濾用戶非法請求
3.日誌Filter:詳細記錄用戶的特殊請求
4.負責解碼Filter:包括對非標準解碼的請求解碼
5.XSLT Filter:能改變XML內容

用途

1.在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest,根據需要檢查HttpServletRequest,可以修改HttpServletRequest頭和數據
2.在HttpServletResponse到達客戶端之前,攔截HttpServletResponse,根據需要檢查HttpServletResponse,可以修改HttpServletResponse頭和數據

Servlet Filter在controller之前檢查並修改請求和響應的內容
一個Filter可負責攔截多個請求或者響應,一個請求或響應也可被多個請求攔截

Filter創建步驟

1.創建Filter類,實現javax.servlet.Filter接口的三個方法:
  void init(FilterConfig config); // 用於完成Filter的初始化
  void destroy(); //用於Filter銷毀前,完成一些資源的回收
  // 實現過濾功能,對每個請求以及響應增加的額外處理
  void doFilter(ServletRequest request, ServletResponse response, FilterChain chain);
2.在web.xml文件中配置Filter,或者直接使用註解

采用註解的程序例子:

技術分享圖片
 1 /**
 2  * Description: 設置request的編碼集,並驗證用戶是否登錄
 3  */
 4 // 註解
 5 @WebFilter(filterName = "loginFilter",
 6     urlPatterns = {"/*"},    // 該Filter攔截該項目下的所有用戶請求
 7     initParams = {    // 配置Filter初始化參數
 8         @WebInitParam(name="encoding", value="utf8"),
 9         @WebInitParam(name="loginPage", value="/login.jsp")})
10 public class LoginFilter implements Filter {
11     
12     // 用於訪問Filter的配置信息
13     private FilterConfig config;
14     
15     @Override
16     public void init(FilterConfig filterConfig) throws ServletException {
17         this.config = filterConfig;
18     }
19 
20     @Override
21     public void destroy() {
22         this.config = null;
23     }
24     
25     @Override
26     public void doFilter(ServletRequest servletRequest, 
27         ServletResponse servletResponse, FilterChain chain) 
28         throws IOException, ServletException {
29         // 獲取Filter的配置參數
30         String encoding = config.getInitParameter("encoding");
31         String loginPage = config.getInitParameter("loginPage");
32         
33         // 設置request編碼用的字符集
34         servletRequest.setCharacterEncoding(encoding);
35         // 將ServletRequest請求轉換成HttpServletRequest請求
36         HttpServletResquest request = (HttpServletRequest) servletRequest;
37         // 獲取客戶請求的頁面
38         String requestPath = request.getServletPath();
39         // 判斷用戶是否登錄
40         HttpSession session = request.getSession();
41         // 若沒有,且訪問頁面不是登錄頁面
42         if (session.getAttribute("user") == null && !requestPath.endsWith(loginPage)){
43             // 轉發到登錄頁面
44             request.getRequestDispatcher("/jsp/login.jsp").forward(servletRequest, servletResponse);
45         }
46         else{
47             // 放行
48             chain.doFilter(servletRequest, servletResponse);
49         }
50     }
51     
52 }
技術分享圖片

如果不用註解的方式,需要在web.xml中配置自定義的攔截器:

技術分享圖片
 1 <filter>
 2     <filter-name>loginFilter</filter-name>
 3     <filter-class>filter.LoginFilter</filter-class>
 4     <init-param>
 5         <param-name>encoding</param-name><param-value>utf8</param-value>
 6         <param-name>loginPage</param-name><param-value>/login.jsp</param-value>
 7     </init-param>
 8 </filter>
 9 <filter-mapping>
10     <filter-name>loginFilter</filter-name>
11     <url-pattern>/*</url-pattern>
12 </filter-mapping>
技術分享圖片

如果有多個攔截器,攔截會按照從上至下的順序進行攔截,一般來說處理編碼的攔截器配置在最上面。

有了上述步驟的操作,就可以通過URI進行訪問。
此時如果能夠取得Session中的logined值時,會直接進入下一步處理,否則直接進入登錄頁面。從而完成session的校驗。

參考源:https://blog.csdn.net/wtopps/article/details/72870356
    https://blog.csdn.net/qq_23835497/article/details/79626197

Session會話

定義

Session代表服務器與瀏覽器的一次會話過程,過程可以是連續的,也可以是時斷時續的。

作用

Session是為了保持用戶訪問服務器的交互狀態。
Session機制是一種服務器的機制。當程序需要為客戶端的請求創建一個session的時候,服務器首先檢查這個客戶端的請求裏是否已經包含一個session id。
如果已經包含session id,說明以前已經為此客戶創建過session,服務器就按照session id把session檢索出來使用。如果客戶請求裏不含session id,則為此客戶創建一個session,並且生成一個與此session相關聯的session id,此session id將在本次響應中返回給客戶端保存。

創建時機

session在有客戶端訪問時並沒有被創建,直到server端程序(如Servlet)調用HttpServletRequest.getSession()/HttpServletRequest.getSession(true)此類語句時才會被創建。

刪除時機

session在以下情況被刪除:
1.程序調用HttpSession.invalidate()
2.距離上一次收到客戶端發送的session id時間間隔超過了session的最大有效時間
3.服務器進程被停止

參考源:https://blog.csdn.net/canot/article/details/50667793
    https://blog.csdn.net/pengpenglin/article/details/706095

Filter過濾器與Session會話跟蹤技術