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();