實現session超時後自動跳轉到登錄頁面(前臺JS,JAVA,判斷是否Ajax請求)

JS實現頁面超時後自動跳轉到登錄頁面javascript

網友方案:html

<script language="javascript">   
var myTime = setTimeout("Timeout()", 60000);   
function resetTime() {   
    clearTimeout(myTime);   
    myTime = setTimeout('Timeout()', 60000);   
}  
function Timeout() {   
    alert("您的登陸已超時, 請點肯定後從新登陸!");   
    document.location.href='login.jsp';   
}   
document.documentElement.onkeydown=resetTime;  
document.doocumentElement.onclick=resetTime;  
</script>

實際操做:java

<script type="text/javascript">  
	window.onload = function caoke(){
		setTimeout(wo,1000*10);
	}
	function wo(){
		alert("因爲您長時間沒有操做,爲保證您的安全,
		請從新登陸!");
		window.location.href = "${ctx}" ;
		if(window.parent != window){
	        window.parent.location.reload(true);
		}
	}
</script>

java 後臺 過濾器實現jquery

@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		boolean isExclude = false ;
		HttpServletRequest request = (HttpServletRequest) req ;
		HttpServletResponse response = (HttpServletResponse) res ;
		String url = request.getServletPath() ;
		System.out.println(url);
		for (String page : excludedPageArr) {	//判斷是否在過濾url以外     
			if(request.getServletPath().equals(page)){     
				isExclude = true;     
				break ;     
			}     
		} 
		String uString = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath() ;
		if(isExclude){	//在過濾url以外     
			chain.doFilter(request, response);     
		} else {	//不在過濾url以外,判斷session是否存在     		
			HttpSession session =  request.getSession(); 
			int time = session.getMaxInactiveInterval();
			if (session.getAttribute("user") == null) {    
				//這裏進行了判斷是否是ajax請求,ajax請求不可以把返回的js信息執行
				if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
                                        response.addHeader("sessionstatus", "timeOut");
					response.addHeader("loginPath", request.getContextPath());
					chain.doFilter(request, response);// ajax請求的判斷,先放行,沒有找到解決方案
				} else {
				//正常的請求能夠直接彈出提示。
					response.setCharacterEncoding("utf-8");
					response.setContentType("text/html;charset=UTF-8");
					PrintWriter writer = response.getWriter();
					
					String data = "	<script type=\"text/javascript\"> " ;
						data += "	alert('因爲您長時間沒有操做,爲保證您的安全,請從新登陸!');	" ;
						data += "	window.top.location.href = '"+request.getContextPath()+"' ;	" ;
//						data += "	if(window.parent != window){	" ;
//						data += "		window.parent.location.reload(true);	" ;
//						data += "	}	" ;
						data += "	</script>	" ;
					
					writer.print(data);
					writer.close();
				}
			} else {     
				chain.doFilter(request, response);     
			}     
		}
		
	}

客戶端JS,用於ajax請求session超時ajax

對於jquery安全

<script type="text/javascript">
$(document).ajaxComplete(function(event, xhr, settings) {  
	    if(xhr.getResponseHeader("sessionstatus")=="timeOut"){  
	        if(xhr.getResponseHeader("loginPath")){
	            alert("因爲您長時間沒有操做,爲保證您的安全,請從新登陸!");
	            window.top.location.href = xhr.getResponseHeader("loginPath") ;
	        }else{  
	            alert("請求超時請從新登錄 !");  
	        }  
	    }  
	});  
</script>

對於extjs的ajax請求session

Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);
    function checkUserSessionStatus(conn,response,options){
        if(response.getResponseHeader("sessionstatus") == 'timeout'){
            if(response.getResponseHeader("loginPath")){
                alert("會話過時,請從新登錄!");
                window.top.location.href = response.getResponseHeader("loginPath");
            }else{
                alert("請求超時請從新登錄 !");
            }
        }
    }

若是使某個ajax請求不受全局方法的影響,那麼能夠在使用$.ajax()方法時,將參數中的global設置爲false,jquery代碼以下:jsp

$.ajax({
    url:"test.html",
    global:false//不觸發全局ajax事件
})

本文參考:http://www.javashuo.com/article/p-vtcxnrer-kh.htmlide

相關文章
相關標籤/搜索