1. 程式人生 > >SpringMVC 配置攔截器 HandlerInterceptor

SpringMVC 配置攔截器 HandlerInterceptor

目錄

一、實現思路

二、具體實現

三、HandlerInterceptorAdapter 


一、實現思路

在 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;
    }
}