最近公司內(nèi)部框架中對session超時這一功能未實現(xiàn),由于采用iframe結(jié)構(gòu),Session超時后,當點擊左側(cè)系統(tǒng)菜單時,會在iframe的右側(cè)再次彈出登陸框。
該問題是由于沒有設(shè)置攔截器造成。
添加攔截器思路:當Session超時后,用戶點擊menu時,需要用Interceptor進行前項攔截,并判斷此時session中是否還存在用戶信息,如果不存在,將其指定登陸主頁面。
如下代碼:
1)首先在applicationContext-mvc.xml中加入mvc:interceptor標簽。
[html] view plain copy <!-- session timeout interceptor --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/*/*" /> <bean class="com.lenovo.lstp.mam.interceptor.SessionTimeoutInterceptor" > <PRoperty name="allowUrls"> <list> <value>/login/login.do</value> <value>/common/language.do</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors> <!-- exception handler --> <bean id="handlerExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" > <property name="exceptionMappings"> <props> <prop key="com.lenovo.lstp.mam.exception.SessionTimeoutException">/blank</prop> </props> </property> </bean> 上述代碼中首先要在系統(tǒng)內(nèi)部包中創(chuàng)建一個名為SessionTimeoutInterceptor的攔截器,并指定允許的訪問的url為list中集合。當用戶從此地址登陸后,無需進行攔截。
SessionTimeoutException中為當攔截生效后,會throw出該異常。
并進入blank.jsp頁面。
2)第二步則要進行攔截器SessionTimeoutInterceptor創(chuàng)建,代碼如下:
[java] view plain copy/** * Session超時,攔截訪問 * */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestUrl = request.getRequestURI(); for(String url : allowUrls) { if(requestUrl.endsWith(url)) { return true; } } String session = (String) WebUtils.getSessionAttribute(request, "username"); if(session != null) { return true; }else { throw new SessionTimeoutException(); } } 除了被允許的Url,其他任何Url,只要沒有檢查到Session的存在,則會拋出SessionTimeoutException,用于去指向登陸頁面,SessionTimeoutException中則無需寫入任何操作。3)由于iframe布局會造成登陸框內(nèi)嵌問題,因此可以通過以下方式實現(xiàn),代碼如下:
[javascript] view plain copyvar session = "${user}"; if("" == session){ top.location = "transfer.jsp"; } if (null == session) { top.location = "transfer.jsp"; } 在blank.jsp中引入一個中轉(zhuǎn)頁transfer.jsp。這個頁面用于進行post跳轉(zhuǎn),再次去請求login.do。top.location為指定在主頁面展示,而不是在內(nèi)嵌的頁面展示。
4)第四步則需要進行二次login.do的請求,代碼如下:
[plain] view plain copy<script type="text/Javascript"> $(document).ready(function(){ document.transfer.submit(); }); </script> <body> <form name="transfer" action="login/login.do" method="post"></form> </body> 當進入該頁面,會自動提交login.do請求,但是之前由于頁面允許了login.do的進入,該操作可以在loginControll中進行判斷。代碼如下:
[java] view plain copy/* After session timeout, check dto's username, and return login.jsp. */ if(dto.getUsername() == null) { ModelAndView mv = new ModelAndView("login"); return mv; } 在login方法中引入該判斷 ,對二次訪問該Controll的信息進行判斷,如果用戶名沒有的話,則自動跳回login.jsp頁面重新輸入。此時,已大功告成,如果登陸頁面有其他鏈接,可以在allowurl去進行配置。
以上轉(zhuǎn)載自http://blog.csdn.net/fly2749/article/details/8702855
新聞熱點
疑難解答