1. 程式人生 > >SpringMvc 攔截器 對未登入系統的操作進行攔截處理

SpringMvc 攔截器 對未登入系統的操作進行攔截處理

各類攔截器的傳統寫法案例:

1 在spring-mvc.xml 檔案中新增 攔截器 如下:

<!-- 通用攔截器配置 -->
<mvc:interceptors>
    ...
    ...
    <mvc:interceptor>
        <mvc:mapping path="/data/**"/>
        <bean class="com.icinfo.system.interceptor.NotLoggedInToIntercept"/>
    </mvc:interceptor>
</mvc:interceptors>

2  攔截器類編寫如下:

package com.icinfo.system.interceptor;

import com.icinfo.support.constants.Constants;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 描述 未登入認證訪問攔截
 *
 * @author 
 * @date 2018/11/8 
 */
public class NotLoggedInToIntercept implements HandlerInterceptor {
    //登入頁地址
    private static final String loginUrl = "/";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
        HttpSession session = request.getSession(false);
        if (session == null || !request.isRequestedSessionIdValid()) {
            response.sendRedirect(request.getContextPath() + loginUrl);
            return false;
        }

        //獲取登入使用者資訊
        Object object = session.getAttribute(Constants.SESSION_LOG_KEY);
        if (object == null) {
            response.sendRedirect(request.getContextPath() + loginUrl);
            return false;
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {

    }
}

攔截器: 就是對請求進行攔截,做一些預處理、後處理或返回處理的操作 。

Spring MVC中使用攔截器的方法,也可繼承HandlerInterceptorAdapter類,並根據需求實現其中的preHandle方法(預處理)、postHandle方法(返回處理),afterCompletion方法(後處理)。

下面重點說下preHandler方法:

當請求來的時候,先經過applyPreHandle,內部會按順序獲取所有的攔截器,並依次攔截

當進入攔截器鏈中的某個攔截器,並執行preHandle方法後

1.當preHandle方法返回false時,從當前攔截器往回執行所有攔截器的afterCompletion方法,再退出攔截器鏈。也就是說,請求不繼續往下傳了,直接沿著來的鏈往回跑。

2.當preHandle方法全為true時,執行下一個攔截器,直到所有攔截器執行完。再執行被攔截的Controller。然後進入攔截器鏈,執行所有攔截器的postHandle方法,完後從最後一個攔截器往回執行所有攔截器的afterCompletion方法.