Filter過濾器與Session會話跟蹤技術
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會話跟蹤技術