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事件 })