springMVC自定義攔截器配置
阿新 • • 發佈:2019-02-14
- springMVC中自定義攔截器只需實現HandlerInterceptor ,先看看這個介面。
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():這個方法在業務處理器處理請求之前被呼叫,在該方法中對使用者請求request進行處理。如果程式設計師決定該攔截器對請求進行攔截處理後還要呼叫其他的攔截器,或者是業務處理器去進行處理,則返回true;如果程式設計師決定不需要再呼叫其他的元件去處理請求,則返回false。
postHandle():這個方法在業務處理器處理完請求後,但是DispatcherServlet向客戶端返回請求前被呼叫,在該方法中對使用者請求request進行處理。
afterCompletion():這個方法在DispatcherServlet完全處理完請求後被呼叫,可以在該方法中進行一些資源清理的操作。
下面通過一個例子來說明如何使用SpringMVC框架的攔截器。
2. 在這裡實現使用者攔截:通過判斷是否是編輯檢視的頁面,如果是,判斷session中的使用者名稱存在不存在,就可以了;
public class LoginInterceptor implements HandlerInterceptor {
//執行時機:進入action方法之前執行
//使用場景:用於使用者認證、使用者授權攔截
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//校驗使用者身份是否合法
HttpSession session = request.getSession();
//自定義的登陸使用者
ActiveUser activeUser = (ActiveUser) session.getAttribute(Config.ACTIVEUSER_KEY);
if(activeUser != null){
//使用者已經登陸,放行
return true;
}
//校驗使用者訪問是否是公開資源 地址
List<String> open_urls = ResourcesUtil.gekeyList(Config.ANONYMOUS_ACTIONS);
//使用者訪問的url
String url = request.getRequestURI();
for(String open_url:open_urls){
if(url.indexOf(open_url)>=0){
//如果訪問的是公開 地址則放行
return true;
}
}
//攔截使用者操作,跳轉到登陸頁面
//request.getRequestDispatcher("/WEB-INF/jsp/base/login.jsp").forward(request, response);
//丟擲異常,異常程式碼106(需要登陸後繼續操作)
ResultUtil.throwExcepion(ResultUtil.createWarning(Config.MESSAGE, 106, null));
return false;
}
//執行時機:進入action方法,在返回modelAndView之前執行
//使用場景:在這裡統一對返回資料進行處理,比如統一新增選單 導航
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
//執行時機:action方法執行完成,已經 返回modelAndView,執行。
//使用場景:統一處理系統異常,在這裡統一記錄系統日誌 ,監控action方法執行時間,在preHandle記錄開始時間,在afterCompletion記錄結束時間
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
3.springmvc配置檔案中需要新增以下資訊
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<!-- 使用者身份校驗的攔截器 -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.kongl.base.filter.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
最後說一下,這裡只是對springMVC的攔截器簡單實現,如果需要使用者認證授權,以及其他更強大功能請研究安全框架shiro或者spring security。本人菜鳥一枚,沒有對其底層進行研究,如有不妥請大神指正。