目錄
一、實現思路
在 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;
}
}