天天看點

springMVC使用攔截器檢查使用者登入

參考文章

  1. 編寫攔截器類
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
        
    }

}           

需要注意的是,如果沒有登入,重定向的路徑寫法:

  1. response.sendRedirect("/abc/") ,被攔截路徑(localhost:8080/a/b/c/d/../m),可以是任意長度路徑.重定向的路徑是:localhost:8080/abc/
  2. response.sendRedirect("abc/")或者response.sendRedirect("abc") 被攔截的路徑(localhost:8080/../xxx/m),重定向的路徑是:localhost:8080/../xxx/abc/,就是在被攔截的路徑上重新定向.
  3. response.sendRedirect("/") ,被攔截路徑(localhost:8080/a/b/c/d/../m),可以是任意長度路徑.重定向的路徑是:localhost:8080
  4. 在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) 攔截器的相關配置見