1. 程式人生 > >(轉) ssm 攔截器驗證使用者登入session

(轉) ssm 攔截器驗證使用者登入session

public class CommonInterceptor extends HandlerInterceptorAdapter{
    private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);
    /*
     * 利用正則對映到需要攔截的路徑

    private String mappingURL;

    public void setMappingURL(String mappingURL) {
               this.mappingURL = mappingURL;
    }
  */
    /**
     * 在業務處理器處理請求之前被呼叫
     * 如果返回false
     *     從當前的攔截器往回執行所有攔截器的afterCompletion(),再退出攔截器鏈
     * 如果返回true
     *    執行下一個攔截器,直到所有的攔截器都執行完畢
     *    再執行被攔截的Controller
     *    然後進入攔截器鏈,
     *    從最後一個攔截器往回執行所有的postHandle()
     *    接著再從最後一個攔截器往回執行所有的afterCompletion()
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if ("GET".equalsIgnoreCase(request.getMethod())) {
            RequestUtil.saveRequest();
        }
        log.info("==============執行順序: 1、preHandle================");
        String requestUri = request.getRequestURI();
        String contextPath = request.getContextPath();
        String url = requestUri.substring(contextPath.length());

        log.info("requestUri:"+requestUri);
        log.info("contextPath:"+contextPath);
        log.info("url:"+url);

        User user =  (User) request.getSession().getAttribute("userbean");
        if(user == null){
            response.setCharacterEncoding("UTF-8");
            log.info("Interceptor:跳轉到login頁面!");
            request.getRequestDispatcher("login.do").include(request, response);
            return false;
        }else
            return true;
    }

    /**
     * 在業務處理器處理請求執行完成後,生成檢視之前執行的動作
     * 可在modelAndView中加入資料,比如當前時間
     */
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        log.info("==============執行順序: 2、postHandle================");
        if(modelAndView != null){  //加入當前時間
            modelAndView.addObject("var", "測試postHandle");
        }
    }

    /**
     * 在DispatcherServlet完全處理完請求後被呼叫,可用於清理資源等
     *
     * 當有攔截器丟擲異常時,會從當前攔截器往回執行所有的攔截器的afterCompletion()
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        log.info("==============執行順序: 3、afterCompletion================");
    }

}

springMVC  配置檔案

<mvc:interceptors>
    <mvc:interceptor>
        <!-- 匹配的是url路徑, 如果不配置或/**,將攔截所有的Controller -->
        <mvc:mapping path="/" />
        <mvc:mapping path="/main.do" />
        <bean class="com.hys.interceptor.CommonInterceptor"></bean>
    </mvc:interceptor>
    <!-- 當設定多個攔截器時,先按順序呼叫preHandle方法,然後逆序呼叫每個攔截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>

不攔截 配置

<!--不攔截的連線
            <mvc:exclude-mapping path="/login/load.do"/>-->


session 過期處理 iframe 跳轉

HttpSession session = request.getSession();  
Object obj = session.getAttribute(Constant.LOGIN_USER);  
    if (obj == null) {  
        PrintWriter out = response.getWriter();  
        out.println("<html>");      
        out.println("<script>");      
        out.println("window.open ('"+request.getContextPath()+"/index.html','_top')");      
        out.println("</script>");      
        out.println("</html>");    
        return false;  
    }