參考文章
- 編寫攔截器類
package cultivate_web.interceptor;
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;
import lombok.extern.slf4j.Slf4j;
/**
* 使用攔截器驗證是否登錄
* @author caichangqing5
* @date 2018年8月16日 上午11:05:07
*/
@Slf4j
public class LoginInterceptor implements HandlerInterceptor{
/**
* 在所有攔截的方法執行前攔截
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
Object obj = session.getAttribute("loginUser");
if(obj == null){ //沒有登錄
log.debug("cultivate_web.interceptor.LoginInterceptor.preHandle(HttpServletRequest, HttpServletResponse, Object)--------------not login");
response.sendRedirect("/cultivate-job/");//路徑是localhost:8080/cultivate-job/,就是網站的入口路徑,會定向到登錄頁面
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
需要注意的是,如果沒有登錄,重定向的路徑寫法:
-
response.sendRedirect("/abc/") ,被攔截路徑(localhost:8080/a/b/c/d/../m),可以是任意長度路徑.重定向的路徑是:localhost:8080/abc/
-
response.sendRedirect("abc/")或者response.sendRedirect("abc") 被攔截的路徑(localhost:8080/../xxx/m),重定向的路徑是:localhost:8080/../xxx/abc/,就是在被攔截的路徑上重新定向.
-
response.sendRedirect("/") ,被攔截路徑(localhost:8080/a/b/c/d/../m),可以是任意長度路徑.重定向的路徑是:localhost:8080
-
在spring mvc配置文件中添加攔截器配置
<mvc:interceptors>
<mvc:interceptor>
<!-- 先匹配所有路徑,然后排除不需要檢查的路徑 -->
<mvc:mapping path="/**"/>
<!-- 與登錄相關的請求 -->
<mvc:exclude-mapping path="/*.jsp"/>
<mvc:exclude-mapping path="/**/login"/><!-- 放行登錄請求 -->
<!-- 網站的登錄路徑是 "http://localhost:8080/cultivate-job/"
路徑path="/"表示的路徑就是網站入口路徑,
也就是說攔截器只方向兩種請求:
1. 錯誤頁面,直接訪問jsp頁面,這些頁面不在WEB-INF目錄下,可以直接訪問
2. 網站入口請求,檢查到沒有登錄,會重定向到網站入口路徑,再被定向到登錄頁面
-->
<mvc:exclude-mapping path="/"/>
<!-- 以下是靜態資源 -->
<mvc:exclude-mapping path="/images/**" />
<mvc:exclude-mapping path="/css/**" />
<mvc:exclude-mapping path="/font/**" />
<mvc:exclude-mapping path="/js/**" />
<mvc:exclude-mapping path="/datepicker/**" />
<!-- 用戶是否已經登錄的檢查bean -->
<bean class="cultivate_web.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
注意:
a) <bean class="cultivate_web.interceptor.LoginInterceptor"/>
配置的是上面新建的攔截器類
b) 需要指定放行的請求,參見上面注釋
c) 攔截器的相關配置見參考文章