SpringMVC 配置攔截器 HandlerInterceptor
阿新 • • 發佈:2018-11-09
目錄
一、實現思路
在 SpringMVC 或者 SSM 環境的專案下,新建一個攔截類,繼承 HandlerInterceptor 介面,然後實現接口裡面的三個方法,接著在 preHandle 方法裡面編寫攔截後的相關處理,然後在 springmvc 的配置中,將所有訪問 controller 的連結給全都攔截下來就行。
注意:springmvc 配置攔截後,可能會把靜態資源給攔截掉,這時候只需要把靜態資源設定為不攔截就行,具體實現看下面。
二、具體實現
public class LoginInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //獲取請求的URL String url = request.getRequestURI(); //URL:除了登入請求外,其他的URL都進行攔截控制 if( url.indexOf("/login") >= 0 ){ return true; } //獲取 Session HttpSession session =request.getSession(); TAdmin tadmin = (TAdmin)session.getAttribute("user"); //判斷Session中是否有使用者資料,如果有,則返回true,繼續想下執行 if( tadmin != null ){ return true; } //不符合條件的給出提示資訊,並轉發到登入頁面 request.getRequestDispatcher("/jsp/login/login.jsp").forward(request,response); return false; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
在 springmvc 的配置中新增下面的程式碼:
<!-- 5.配置攔截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/checkCode" /> <mvc:exclude-mapping path="/getcookie" /> <mvc:exclude-mapping path="/loginout" /> <!-- 對靜態資源不採取攔截 --> <mvc:exclude-mapping path="/**/*.js" /> <mvc:exclude-mapping path="/**/*.css" /> <mvc:exclude-mapping path="/**/*.png" /> <mvc:exclude-mapping path="/**/*.gif" /> <mvc:exclude-mapping path="/**/*.jpg" /> <mvc:exclude-mapping path="/**/*.jpeg" /> <mvc:exclude-mapping path="/**/iconfont.*" /> <bean class="com.yyzheng.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
<mvc:mapping path="/**" />:攔截所有訪問 controller 的路徑
<mvc:exclude-mapping path="/loginout" />:對不需要攔截的路徑進行釋放處理
bean :是指向到上面的 Java 類(LoginInterceptor)
至於靜態資源的處理,根據自己專案所用到相關資源再進行修改。
三、HandlerInterceptorAdapter
下面是另外一種寫,繼承的是 HandlerInterceptor 介面的實現類。配置的話是一樣。
public class ShopLoginInterceptor extends HandlerInterceptorAdapter { /** * 主要做事前攔截,即使用者操作發生前,改寫 preHandle 裡的邏輯,進行攔截 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //從session中取出使用者資訊 Object userObj = request.getSession().getAttribute("user"); if (userObj != null) { //若使用者資訊不為空,則將session裡的使用者資訊轉換成PersonInfo PersonInfo user = (PersonInfo) userObj; //做控制判斷,確保userId不為空,並且該賬號的可用狀態為1,並且使用者型別為店家 if (user != null && user.getUserId() != null && user.getUserId() > 0 && user.getEnableStatus() == 1) //若通過驗證則返回true,攔截器返回true之後,使用者接下來的操作得以正常執行 return true; } //若不滿足登入驗證,則直接跳轉到賬號登入頁面 PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<script>"); out.println("window.open ('" + request.getContextPath() + "/local/login?usertype=2','_self')"); out.println("</script>"); out.println("</html>"); return false; } }