1. 程式人生 > >前後端分離後的session失效問題

前後端分離後的session失效問題

問題:公司專案將springMVC的jsp專案做了前後端分離的改造,前端全部採用html5+ajax方式跟後臺互動,但是有一個問題就是:當後臺的session失效後,重新整理頁面並不會自動跳轉到首頁!

目前我採取的辦法是:後臺定義一個攔截器,攔截所有請求(但不包括驗證碼介面、登陸介面),判斷是否登陸失效即session過期,如果過期則返回前段403狀態碼,ajax前端收到後重定向到首頁進行登陸。

package com.admin.interceptor;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.admin.util.web.AuthorityUtils;

/**
 * 許可權控制攔截器
 * 
 */
public class AuthorityInterceptor implements HandlerInterceptor {
	private static final Logger logger = LoggerFactory.getLogger(AuthorityInterceptor.class);
	
	
	  
    /** 
     * 在DispatcherServlet之前執行 
     * */  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {  
    	logger.info("************BaseInterceptor preHandle executed**********");
    	String reqUrl = request.getServletPath();
    	boolean isLogin = AuthorityUtils.isLogin(request);
    	if((!reqUrl.contains("/checkCode.do") && !reqUrl.contains("/login.do")) && !isLogin){
    		 response.setContentType("text/html;charset=utf-8");
             response.setStatus(403);
    		 return false;
    	}
    	
        return true;  
    }  
  
    /** 
     * 在controller執行之後的DispatcherServlet之後執行 
     * */  
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView mv)  
            throws Exception {  
    	logger.info("************BaseInterceptor postHandle executed**********");  
    }  
      
    /** 
     * 在頁面渲染完成返回給客戶端之前執行 
     * */  
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception e)  
            throws Exception {  
    	logger.info("************BaseInterceptor afterCompletion executed**********");  
    }  
}

spring-mvc的配置:

  <mvc:interceptors>
        <mvc:interceptor>
            <!-- 對登入操作進行攔截 -->
            <mvc:mapping path="/**/*.do"/>
            <bean class="com.admin.interceptor.AuthorityInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

前端ajax:

	$.ajax({
        url: "/user/info.do",            
        type: 'post',
        data: "",
        dataType: "json",
        success: function (data) {
        	console.log(data);
        	....
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
           	if(XMLHttpRequest.status=='403'){
           		window.location.href="/index.html"
           	}
       }
	});

如果大家還有好的辦法,請多多指點哈!畢竟我不是專業前端,難免孤陋寡聞.