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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章