问题描述
项目中登陆用到了shiro验证框架,session超时,shiro默认会迁移到登陆画面。现在想session超时想弹出一个对话框,不知该如何解决。<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="sessionDAO" ref="sessionDAO"/> <property name="globalSessionTimeout" value="30000"/> <property name="sessionListeners" ref="dmpSessionListener"/> </bean> <bean id="dmpSessionListener" class="com.pactera.platform.reqm.web.util.DmpSessionListener"/> public class DmpSessionListener implements SessionListener{@Overridepublic void onStart(Session session) {// TODO Auto-generated method stubSystem.out.println("onStart");}@Overridepublic void onStop(Session session) {// TODO Auto-generated method stubSystem.out.println("onStop");}@Overridepublic void onExpiration(Session session) {// TODO}}查了一下,有个监听session超时的方法,可是监听到应该怎样弹对话框呢,前台开发不熟悉。请大家赐教。
解决方案
这里不是使用监听 思路都一样,简单说下:如果你使用的是FormAuthenticationFilter,那么继承FormAuthenticationFilter覆盖onAccessDenied方法,方法实现: if (isLoginRequest(request, response)) { if (isLoginSubmission(request, response)) { return executeLogin(request, response); } else { return true; } } else { if(AjaxUtils.isAjaxRequest(WebUtils.toHttp(request))){ HttpServletResponse res = WebUtils.toHttp(response); res.sendError(HttpServletResponse.SC_UNAUTHORIZED); }else{ redirectToLogin(request, response); }// saveRequestAndRedirectToLogin(request, response); return false; }然后前台设置ajax全局状态码处理 捕获401,给出提示或做进一步处理资源权限和角色权限同样可以使用这种方式!我想我说的够清楚了!
解决方案二:
首先,完全没有必要给这个提示,你想想,如果用户打开了10个页面,session过期了,10个窗口都会弹出这个,用户要关闭弹出框10次,体验度太差了。我是到现在都没见过有网站会这样弄的。你顶多在页面跳转到登录之前给他个超时的提示。
解决方案三:
在页面上记录一个时间, 然后用javascript去判断, 如果session失效时间快到了, 用户还没和server交互过,那就弹出一个对话框.<div id="demo"></div><script> var sessionTime=5; var intvalue=1; function start(){ intvalue ++; document.getElementById("demo").innerHTML=" " + Math.floor(((sessionTime-intvalue)/60)).toString()+"分"+((sessionTime-intvalue)%60).toString()+"秒"; if(intvalue>=sessionTime){ end(); } } function end(){alert("时间到了!!");window.location.href="http://www.baidu.com"; }window.setInterval("start()",1000);</script>