SpringMvc 攔截器 對未登入系統的操作進行攔截處理
各類攔截器的傳統寫法案例:
1 在spring-mvc.xml 檔案中新增 攔截器 如下:
<!-- 通用攔截器配置 -->
<mvc:interceptors>
...
...
<mvc:interceptor>
<mvc:mapping path="/data/**"/>
<bean class="com.icinfo.system.interceptor.NotLoggedInToIntercept"/>
</mvc:interceptor>
</mvc:interceptors>
2 攔截器類編寫如下:
package com.icinfo.system.interceptor; import com.icinfo.support.constants.Constants; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 描述 未登入認證訪問攔截 * * @author * @date 2018/11/8 */ public class NotLoggedInToIntercept implements HandlerInterceptor { //登入頁地址 private static final String loginUrl = "/"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { HttpSession session = request.getSession(false); if (session == null || !request.isRequestedSessionIdValid()) { response.sendRedirect(request.getContextPath() + loginUrl); return false; } //獲取登入使用者資訊 Object object = session.getAttribute(Constants.SESSION_LOG_KEY); if (object == null) { response.sendRedirect(request.getContextPath() + loginUrl); return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception { } }
攔截器: 就是對請求進行攔截,做一些預處理、後處理或返回處理的操作 。
Spring MVC中使用攔截器的方法,也可繼承HandlerInterceptorAdapter類,並根據需求實現其中的preHandle方法(預處理)、postHandle方法(返回處理),afterCompletion方法(後處理)。
下面重點說下preHandler方法:
當請求來的時候,先經過applyPreHandle,內部會按順序獲取所有的攔截器,並依次攔截
當進入攔截器鏈中的某個攔截器,並執行preHandle方法後
1.當preHandle方法返回false時,從當前攔截器往回執行所有攔截器的afterCompletion方法,再退出攔截器鏈。也就是說,請求不繼續往下傳了,直接沿著來的鏈往回跑。
2.當preHandle方法全為true時,執行下一個攔截器,直到所有攔截器執行完。再執行被攔截的Controller。然後進入攔截器鏈,執行所有攔截器的postHandle方法,完後從最後一個攔截器往回執行所有攔截器的afterCompletion方法.