相似於Servlet開發中的過濾器Filter,用於對處理器進行預處理和後處理.css
經常使用場景:java
一、日誌記錄:
記錄請求信息的日誌,以便進行信息監控、信息統計、計算PV(Page View)等。
web
二、權限檢查:
如登陸檢測,進入處理器檢測檢測是否登陸,若是沒有直接返回到登陸頁面;
spring
三、性能監控:
有時候系統在某段時間莫名其妙的慢,能夠經過攔截器在進入處理器以前記錄開始時間,在處理完後記錄結束時間,從而獲得該請求的處理時間(若是有反向代理,如apache能夠自動記錄);
apache
四、通用行爲:
讀取cookie獲得用戶信息並將用戶對象放入請求,從而方便後續流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都須要的便可使用攔截器實現。
編程
五、OpenSessionInView:
如Hibernate,在進入處理器打開Session,在完成後關閉Session。
spring-mvc
…………本質也是AOP(面向切面編程),也就是說符合橫切關注點的全部功能均可以放入攔截器實現。
cookie
package org.springframework.web.servlet; public interface HandlerInterceptor { boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
preHandle:預處理回調方法,實現處理器的預處理(如登陸檢查),第三個參數爲響應的處理器(如咱們上一章的Controller實現);session
返回值:true表示繼續流程(如調用下一個攔截器或處理器);mvc
false表示流程中斷(如登陸檢查失敗),不會繼續調用其餘的攔截器或處理器,此時咱們須要經過response來產生響應;
postHandle:後處理回調方法,實現處理器的後處理(但在渲染視圖以前),此時咱們能夠經過modelAndView(模型和視圖對象)對模型數據進行處理或對視圖進行處理,modelAndView也可能爲null。
afterCompletion:整個請求處理完畢回調方法,即在視圖渲染完畢時回調,如性能監控中咱們能夠在此記錄結束時間並輸出消耗時間,還能夠進行一些資源清理,相似於try-catch-finally中的finally,但僅調用處理器執行鏈中preHandle返回true的攔截器的afterCompletion。
登錄檢測Demo:
處理攔截器,攔截檢測除了/login以外全部url是否登錄,未登陸都將其跳轉到/login
package com.test.interceptor; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class UserSecurityInterceptor implements HandlerInterceptor{ private List<String> excludedUrls; @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub } public List<String> getExcludedUrls() { return excludedUrls; } public void setExcludedUrls(List<String> excludedUrls) { this.excludedUrls = excludedUrls; } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub } @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { String requestUri = arg0.getRequestURI(); for (String url : excludedUrls) { if (requestUri.endsWith(url)) { return true; } } HttpSession session = arg0.getSession(); if (session.getAttribute("user") == null) { System.out.println(arg0.getContextPath()); arg1.sendRedirect(arg0.getContextPath() + "/login"); } return false; } }
excludedUrls是要放行的url,在spring配置.此外要注意一些相似jpg,css,js靜態文件被攔截的處理
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 自動掃描的包名 --> <context:component-scan base-package="com.test.controller" /> <!-- 默認的註解映射的支持 --> <mvc:annotation-driven /> <!-- 配置資源文件,防止被攔截 --> <mvc:resources location="/WEB-INF/view/image/" mapping="/image/**"/> <mvc:resources location="/WEB-INF/view/js/" mapping="/js/**"/> <mvc:resources location="/WEB-INF/view/css/" mapping="/css/**"/> <!-- 攔截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/*" /> <bean class="com.test.interceptor.UserSecurityInterceptor"> <property name="excludedUrls"> <list> <value>/login</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors> <!-- 視圖解釋類 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
控制器代碼:
@RequestMapping("/login") public void login() { return; }