springMVC攔截器功能簡單案例

Interceptor(即處理器攔截器、攔截器),類似於 Servlet 開發中的過濾器 Filter,用於對處理器(Controller)進行預處理和後處理。

常見的應用場景:

1. 日誌記錄:記錄請求信息的日誌,以便進行信息監控、信息統計、計算PV(Page View)等。

2.權限檢查:如登錄檢測,進入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面。

3.性能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完後記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄)。

4.通用行爲:讀取 cookie 得到用戶信息並將用戶對象放入請求,從而方便後續流程使用。

舉個例子驗證用戶是否處於登錄狀態:

springMVC.xml配置文件,添加攔截器功能

<!-- 配置攔截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 匹配的是url路徑, 如果不配置或/**,將攔截所有的Controller -->   
             <mvc:mapping path="/fileUploadController/fileUpload"/>
            <!-- 自定義攔截器名稱及類的映射路徑-->
          <bean id="LoginInterceptor" class="com.test.utils.interceptor.LoginInterceptor"/>  
        </mvc:interceptor>
    </mvc:interceptors> 
jsp界面form表單提交:

  <form method="post" action="findById">  
    <h3>登錄</h3>  
    <label>用戶名:</label><input type="text" name="username">  
    <br> <br>  
    <label>密   碼:</label><input type="password" name="password">  
    <br><br> <br>  
    <div style="text-align: center">  
        <button type="submit">登錄</button>    
        <button type="reset">重置</button>  
        <br>  
        <p><a href="register.jsp">還沒有帳號?點擊這裏註冊!</a></p>  
    </div>  
    </form>  
對用後臺controller接受參數,驗證登錄成功後通過session存儲user(省略了service等代碼):

  @RequestMapping("/findById")
	public String login (String username,Integer password,HttpSession session){
		if(password == null || password.equals("")){
			return "login";
		}else{
			Map<String,Object> map = userService.findByUserId(password);
			if(map == null || map.isEmpty()){
				return "login";
			}
			session.setAttribute("user", map);
//			session.invalidate();
			return "index";
		}
	}

當用戶再次切換其它界面,就會用到攔截器判斷,以下爲攔截器代碼實例:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;


public class LoginInterceptor extends HandlerInterceptorAdapter{
	
	//進入Handler之前執行
	//用於身份認證,身份授權
	 @Override      
	    public boolean preHandle(HttpServletRequest request,      
	            HttpServletResponse response, Object handler) throws Exception {  
		 
	        Map map =   (Map) request.getSession().getAttribute("user");   
	        if(map == null || map.isEmpty()){    
	            System.out.println("Interceptor:跳轉到login頁面!");    
	            request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);    
	            return false;    
	        }else        
	            return true;       
	    }      
	      
	//進入Handler之後,返回modelAndView之前執行
	//應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這裏傳到視圖,也可以在這裏統一指定視圖
	 @Override
	 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
	 throws Exception {
	 System.out.println("postHandle");
	 }
	  
	//Handler執行完成之後執行
	//應用場景:統一異常處理,統一日誌處理
	    @Override      
	    public void afterCompletion(HttpServletRequest request,      
	            HttpServletResponse response, Object handler, Exception ex)      
	            throws Exception {      
	    }      
	    
	     
}

最後補充一下session週期信息:

1.默認session週期爲30min;

2.session週期設置兩種方法如下:

2.1 session.setMaxInactiveInterval(你想設置的時間);設置的時間是以秒計算,它是根據服務器來計算時間.

2.2在web.xml配置文件裏配置:

<session-config>
<session-timeout>20</session-timeout>
</session-config>

上面20的意思是會話的失效時間是20分鐘.這裏是按照分鐘來計算.

session銷燬方法: session.invalidate();



發佈了34 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章