手机版

ajax请求的会话无效

时间:2021-10-01 来源:互联网 编辑:宝哥软件园 浏览:

由于最近的一个项目,模块切换到ajax来请求数据。当会话过期时,ajax请求后没有返回值,只有响应html:

html script type=' text/JavaScript ' window . open(' http://192 . 168 . 0 . 118:8080/welcome action/loginui . do ',' _ top ');/script/htmlAjax现在广泛应用于Web项目中,几乎无处不在,这就带来了另一个问题:当Ajax请求遇到Session超时时该怎么办?

显然,传统的页面跳转在这里不再适用,因为Ajax请求是由XMLHTTPRequest对象而不是浏览器发起的,验证失败后的页面跳转无法在浏览器中反映出来,因为服务器返回(或输出)的信息是由JavaScript(XMLHTTPRequest对象)接收的。

那么我们应该如何应对这种情况呢?

方法

既然服务器返回的消息是由XMLHTTPRequest对象接收的,而XMLHTTPRequest对象又在JavaScript的控制之下,那么我们可以用JavaScript来完成页面跳转吗?

当然,而且很容易实现!但是有一点,我们需要判断HTTP请求是否是Ajax请求(因为AJAX请求和普通请求需要分开处理)。我们如何判断这一点?实际上,Ajax请求不同于普通的HTTP请求,这体现在HTTP请求的头信息中,如下图所示:

上面两张图是火狐的Firebug截取的。前者是普通的HTTP请求头信息。后者是Ajax请求的请求头信息。注意第一张图片被红框包围的部分,这是AJAX请求和普通请求的区别。Ajax请求头包含X-Requested-With信息,它的值是XMLHttpRequest,这正是我们可以使用的。

让我们看看代码是如何实现的。

拦截过滤器

在使用Struts2时,我们通常使用拦截器来拦截权限问题。

拦截器部分代码:

公共字符串拦截(操作上下文调用)引发异常{ //TODO自动生成的方法存根动作上下文AC=调用。getinlocationcontext();httpersvletrequest请求=(httpersvletrequest)AC。获得(Stratsstys .HTTP _ REQUEST);字符串请求类型=请求。getheader(' X-Requested-With ');系统。出去。println('请求类型: '请求类型);httpersvletresponse响应=(httpersvletresponse)AC。获得(Stratsstys .HTTP _ REsponse);//字符串基本路径=请求。getcontextpath();字符串路径=请求。getcontextpath();字符串基本路径=请求。getscheme()' ://'请求。getservername()“:”请求。getserverport()路径;//获取会话映射会话=交流。getSession();//判断会议是否存在及会议中的用户信息是否存在,如果存在不用拦截如果(会话!=null session.get(常量FE_SESSION_BG_USER)!=null session.get(常量. FE_SESSION_BG_AUTH)!=null){ system。出去。对合。getproxy().getActionName()' ');系统。出去。println('命名空间: '调用。getProxy().getNameSpace());//访问路径String visitURL=invocation.getProxy().getNameSpace()"/"调用。getProxy().getActionName()常量FE _ STRUTS _ ACTION _ extension visit URl=visit URl。substring();映射字符串,对象身份验证映射=(映射字符串,对象)会话. FE _ SESSION _ BG _ AUTH);映射整数,字符串操作映射=(映射整数,字符串)授权映射。获取(常量. FE _ BG _ ACTIONMAP);if(actionMap!=null!actionMap.isEmpty() visitURL!=null){ if(actionmap。包含值(访问turl)){系统。出去。println(访问turl '-');返回调用。invoke();} else{ String禁=basePath常量FE _ BG _禁止;response.sendRedirect(禁止);返回null} }返回调用。invoke();} else { if(string uils。is not blank(RequestType)RequestType。equalsignorase(' XMLHttpRequest '){ response。setheader('会话状态','超时');response.sendError(,'会话超时');返回null } else { String action name=invoke。GetProxy().getActionName();系统。出去。println(动作名称);//如果拦截的actionName是loginUI或登录,则不做处理,否则重定向到登录页面if(stringutils。isnotblank(操作名称)操作名称。等于(常量FE _ BG _ LOGINUI)){返回调用。invoke();} else if(stringutils。isnotblank(操作名称)操作名称。等于(常量FE _ BG _ log in)){返回调用。invoke();} else { String login=basePath '常量‘FE _ BG _ log in _ NAMESPACE’常量FE_BG_LOGINUI常量FE _ STRUTS _ ACTION _ EXTENSION//系统。出去。println('基本路径: '基本路径);//response.sendRedirect(登录);PrintWriter out=响应。getwriter();//out。println(' html ');//out。println(' script ');//out。println('窗口。打开('登录' ',' _ top ');');//out。println('/script ');//out。println('/html ');出去。编写(' html脚本类型=' text/JavaScript '窗口。打开('登录' ',' _ top ');/script/html ');返回null} } } }由上面代码可以看出,当会议验证失败(即会议超时)后,我们通过HttpServletRequest取得请求头信息x-请求-与的值,如果不为空且等于XMLHttpRequest,那么就说明此次请求是埃阿斯请求,我们作出的反应就是向响应中添加一条头信息(自定义)并且使响应对象HttpServletResponse返回服务器错误信息(518状态是自己随便定义的);这些信息都会被Java脚本语言接收,那么下面的工作就要将由Java脚本语言代码了。

爪哇岛描述语言代码

美元。ajaxSetup方法用于设置AJAX请求的默认选项,可以认为是全局选项设置。因此,这段代码可以在外部JS文件中提及,并在所需的页面上引用。

/* * *设置未来(全局)AJAX请求的默认选项*主要设置AJAX请求遇到Session过期的情况*/$。ajaxsetup ({type:' post ',complete: function (xhr,status) {var sessionstatus=xhr。getresponseheader(' session status ');if(session status==' time out '){ var top=getTopWinow();Yes=confirm('因为您很长时间没有操作,会话已经过期,请重新登录。);if(yes){ top . location . href='/sky NK/index . html ';} } } });/* * *从页面中的任意嵌套级窗口获取顶层窗口* @返回当前页面的顶层窗口对象*/函数gettopwinow(){ var p=window;while(p!=p . parent){ p=p . parent;}返回p;}以上内容就是我们分享的ajax请求Session的失败问题。希望对大家有用。

版权声明:ajax请求的会话无效是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐