当我们使用Acegi安全框架时,一般都会对所有请求就像拦截。这样,如果session超时,通过DWR进行Ajax远程调用时,同样会被Acegi的Filter拦截,这时Acegi发现用户没有登录,就会对请求进行转发(转发到登录页面),但由于此时进行的是Ajax的调用,页面并不会将进行跳转,而是返回302的HTTP响应码,这样浏览器就不会有任何的反应,这样对用户是非常不友好的。可以通过一些简单的处理,在session超时后,当用户进行Ajax远程调用时,同其他请求一样,返回到登录页面。
首先,在Acegi的安全配置文件(即Spring的配置文件)里面,将/dwr/**路径的请求配置为可以匿名用户可以访问的。
其次,自定义一个DWRRemoter,大概实现如下:
Java代码
public class MyDWRRemoter extends DefaultRemoter
{
public Replies execute( Calls calls )
{
HttpSession session = WebContextFactory.get().getSession();
ISessionContainer sc = ( ISessionContainer ) session.getAttribute( ISessionContainer.SESSION_CONTAINER_KEY );
//session检查
if ( sc == null || sc.getUserInfo() == null )
{
logOut();
return super.execute( new Calls() );
}
else
{
IUserInfo userInfo = sc.getUserInfo();
if(!SecurityFactory.getInstance().isOnline( userInfo.getUserID(), session.getId() ))
{
logOut();
return super.execute( new Calls() );
}
}
return super.execute( calls );
}
private void logOut()
{
WebContext wct = WebContextFactory.get();
Util utilThis = new Util(wct.getScriptSession());
utilThis.addScript( new ScriptBuffer("logOut()"));
}
}
public class MyDWRRemoter extends DefaultRemoter
{
public Replies execute( Calls calls )
{
HttpSession session = WebContextFactory.get().getSession();
ISessionContainer sc = ( ISessionContainer ) session.getAttribute( ISessionContainer.SESSION_CONTAINER_KEY );
//session检查
if ( sc == null || sc.getUserInfo() == null )
{
logOut();
return super.execute( new Calls() );
}
else
{
IUserInfo userInfo = sc.getUserInfo();
if(!SecurityFactory.getInstance().isOnline( userInfo.getUserID(), session.getId() ))
{
logOut();
return super.execute( new Calls() );
}
}
return super.execute( calls );
}
private void logOut()
{
WebContext wct = WebContextFactory.get();
Util utilThis = new Util(wct.getScriptSession());
utilThis.addScript( new ScriptBuffer("logOut()"));
}
}
在web.xml文件中加入DWR的参数,是自定义的DWRRemoter生效:
Xml代码
<init-param>
<param-name>
org.directwebremoting.extend.Remoter
</param-name>
<param-value>com.xxx.base.framework.web.MyDWRRemoter</param-value>
</init-param>
<init-param>
<param-name>
org.directwebremoting.extend.Remoter
</param-name>
<param-value>com.xxx.base.framework.web.MyDWRRemoter</param-value>
</init-param>
最后,在JSP页面上写下方法名为logOut的JavaScript函数,该函数返回到登录页面即可。
通过上面的三个简单步骤,即可实现在DWR调用远程方法时,如果session超时,系统顺利的退出到登录页面的效果。
分享到:
相关推荐
Ajax请求session超时处理流程 java服务器端处理: SessionValidateFilter中修改: if (ServerInfo.isAjax(request)) { request.setAttribute("statusCode", 301); request.setAttribute("message", "Session ...
下面小编就为大家带来一篇Web 开发中Ajax的Session 超时处理方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Struts通过拦截器实现登录后跳转到登录前页面
自己在网上查询整理出来的,欢迎交流! 从 JSF1.2 规范说明中,我们可以发现在恢复视图的生命周期时会抛出ViewExpiredException 异常,因此我们可在恢复视图的生命周期前做一些处理。
NULL 博文链接:https://master3003.iteye.com/blog/1178419
NULL 博文链接:https://ait.iteye.com/blog/1867548
今天有同学在测试小程序的过程中,发现一个问题,调用 微信官方的服务端接口超时 ,比如这个接口,https://api.weixin.qq.com/sns/jscode2session ,因为我们小程序登录的时候,会在自己server端调用微信的API,这个...
如果session超时,而且是ajax请求,就会在响应头里。再用一个全局的方法来处理,session超时要跳转的页面
这里模仿jquery的处理方式实现webix的ajax请求session超时跳转。 具体的做法: 1、查看webix.js源码发现webix.ajax只有请求前的监听函数 “onBeforeAjax”, 要做到获取返回状态跳转登录页面必须要有个返回的监听...
7.session超时处理和httpsession监听器 8.bootstarp-Admin框架 9.记录登录者信息,存储在mongodb中.(使用到百度地图api中的IP精确定位) 已包含工具类: 1.ID生成器 2.日期处理 3.短信验证码发送(使用的是云片网络) ...
最近项目中用到了nginx,后台用的是Java, 发现有一个请求后台处理操过了1分钟,结果请求Status Code为504 Gateway Time-out. 理解了下nginx 所有timeout相关的配置,如下: keepalive_timeout HTTP 有一个 KeepAlive...
昨天去GTSC面试,有面试官问我关于Session丢失之后怎么查的问题,说老实话,开发到现在很少碰到这样的情况,唯一想到的就是Session超时,还有就是做Session读写日志,发觉面试官听了之后不是很满意,汗! 不管怎么说...
Laravel开发-laravel-sessiontimeout 在Laravel5中处理会话超时问题的中间件
[Spring Security 第六部分:Ajax 调用的会话超时处理] ( ) 安装 安装 使用 mvn clean install 编译项目 从 Maven 运行 Jetty:mvn jetty:run 用法 在连接到应用程序 默认用户是“ddoan/password”,但您可以在 ...
在对话超时或者被关闭的时候会触发Session_onEnd事件。程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等。在ASP.NET的程序中要使用Session对象时,必须确保页面...
Laravel 身份验证超时 一个处理身份验证超时的小型 Laravel 8 包。 升级到 v3 时,请参阅 。 有关 Laravel 6+ 的支持,请参阅 。为什么 Laravel 身份验证超时? 有时我们希望在用户未完成并在一段时间内请求时注销...
IIS装上后出现500错误,无法浏览。可用所述方法进行解决
会话超时提示Rails 5 Engine在会话即将超时时...session_timeout_prompter需要css: *= require session_timeout_prompter注意:当前依赖jQuery进行ajax /事件处理。用法在布局或任何要显示超时提示的页面上的body标签