session过期跳转登录页面
生活随笔
收集整理的這篇文章主要介紹了
session过期跳转登录页面
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
項目需要做一個自動登出的功能,查詢了網上的資料,一開始準備用session監聽做,按照下面方式配置監聽器
1.在項目的web.xml文件中添加如下代碼:
?| 1 2 3 4 | <!--添加Session監聽器--> <listener> <listener-class>?監聽器路徑?</listener-class> </listener> |
2.編寫java類。
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public?class?SessionListener?implements?HttpSessionListener?{ public?void?sessionCreated(HttpSessionEvent?arg0)?{ //?session創建時執行??SimpleDateFormat?simpleFormat?=?new?SimpleDateFormat("mm-ss-ms"); String?nowtimes?=?simpleFormat.format(new?Date()); User?u=null; //System.out.println("執行。。?當前時間:"+nowtimes+"_"+u);??HttpSession?ses=?arg0.getSession(); String?id=ses.getId()+"_"+ses.getCreationTime(); } public?void?sessionDestroyed(HttpSessionEvent?arg0)?{ //?session失效時執行??SimpleDateFormat?simpleFormat?=?new?SimpleDateFormat("mm-ss-ms"); String?nowtimes?=?simpleFormat.format(new?Date());? //System.out.println("session失效了。。?結束時間:?"+nowtimes);?} } |
配置完成后等session失效后成功進入sessionDestroyed方法,準備進行頁面跳轉操作,突然發現怎么寫跳轉,愣住了,繼續上網請教大神,發現這個監聽是做一些后臺統計處理的,無法實現頁面跳轉的功能。
只能放棄這方法了,開始使用過濾器實現
1、web.xml中添加過濾器配置
?| 1 2 3 4 5 6 7 8 | <filter> <filter-name>sessionFilter</filter-name> <filter-class>com.orchestrall.web.helper.session.SessionFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>/actions/*</url-pattern> </filter-mapping> |
2、新建SessionFilter類,實現Filter接口。
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | public?class?SessionFilterimplements?Filter?{ public?void?destroy()?{ //?TODO?Auto-generated?method?stub????} public?void?doFilter(ServletRequest?request,?ServletResponse?response, FilterChain?chain)?throws?IOException,?ServletException?{ HttpServletRequest?httpRequest?=?(HttpServletRequest)?request; HttpServletResponse?httpResponse?=?(HttpServletResponse)?response; HttpSession?session?=?httpRequest.getSession(); //?登陸url????????String?loginUrl?=?httpRequest.getContextPath()?+?"/admin/login.jsp"; String?url?=?httpRequest.getRequestURI(); String?path?=?url.substring(url.lastIndexOf("/")); //?超時處理,ajax請求超時設置超時狀態,頁面請求超時則返回提示并重定向????????if?(path.indexOf(".action")?!=?-1 &&?session.getAttribute("LOGIN_SUCCESS")?==?null)?{ //?判斷是否為ajax請求????????????if?(httpRequest.getHeader("x-requested-with")?!=?null &&?httpRequest.getHeader("x-requested-with") .equalsIgnoreCase("XMLHttpRequest"))?{ httpResponse.addHeader("sessionstatus",?"timeOut"); httpResponse.addHeader("loginPath",?loginUrl); chain.doFilter(request,?response);//?不可少,否則請求會出錯????????????}?else?{ String?str?=?"<script?language='javascript'>alert('會話過期,請重新登錄');" +?"window.top.location.href='" +?loginUrl +?"';</script>"; response.setContentType("text/html;charset=UTF-8");//?解決中文亂碼????????????????try?{ PrintWriter?writer?=?response.getWriter(); writer.write(str); writer.flush(); writer.close(); }?catch?(Exception?e)?{ e.printStackTrace(); } } }?else?{ chain.doFilter(request,?response); } } @Override public?void?init(FilterConfig?arg0)?throws?ServletException?{ //?TODO?Auto-generated?method?stub????} } |
3、客戶端JS,用于ajax請求session超時
對于jquery
?| 1 2 3 4 5 6 7 8 9 10 11 12 | <script?type="text/javascript"> $(document).ajaxComplete(function(event,?xhr,?settings)?{?? if(xhr.getResponseHeader("sessionstatus")=="timeOut"){?? if(xhr.getResponseHeader("loginPath")){ alert("會話過期,請重新登陸!"); window.location.replace(xhr.getResponseHeader("loginPath"));?? }else{?? alert("請求超時請重新登陸?!");?? }?? }?? });?? </script> |
對于extjs的ajax請求
?| 1 2 3 4 5 6 7 8 9 10 11 | 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代碼如下:
?| 1 2 3 4 | $.ajax({ url:"test.html", global:false//不觸發全局ajax事件}) |
轉載于:https://my.oschina.net/u/1034537/blog/357350
總結
以上是生活随笔為你收集整理的session过期跳转登录页面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TextView属性大全
- 下一篇: reactive programming