同时多个ajax请求 怎么处理session失效

同时多个ajax请求 怎么处理session失效,第1张

既然服务器返回的消息被XMLHTTPRequest对象接收,而XMLHTTPRequest对象又是在JavaScript的掌控之中,那么我们是否可以利用JavaScript来完成页面跳转呢?

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

AJAX请求头中带有X-Requested-With信息,其值为XMLHttpRequest,这正是我们可以利用的地方。

当Session验证失败(即Session超时)后,我们通过HttpServletRequest取得请求头信息X-Requested-With的值,如果不为空且等于XMLHttpRequest,那么就说明此次请求是Ajax请求,我们作出的反应就是向响应中添加一条头信息(自定义)并且使响应对象HttpServletResponse返回服务器错误信息(518状态是自己随便定义的);这些信息都会被JavaScript接收,那么下面的工作就要将由JavaScript代码了。

$.ajaxSetup方法是来设置AJAX请求默认选项的,我们可以认为是全局的选项设置,因此可以将这段代码提到外部JS文件中,在需要的页面引用。

/**

* 设置未来(全局)的AJAX请求默认选项

* 主要设置了AJAX请求遇到Session过期的情况

*/

$.ajaxSetup({

type: 'POST',

complete: function(xhr,status) {

var sessionStatus = xhr.getResponseHeader('sessionstatus')

if(sessionStatus == 'timeout') {

var top = getTopWinow()

var yes = confirm('由于您长时间没有 *** 作, session已过期, 请重新登录.')

if (yes) {

top.location.href = '/skynk/index.html'

}

}

}

})

/**

* 在页面中任何嵌套层次的窗口中获取顶层窗口

* @return 当前页面的顶层窗口对象

*/

function getTopWinow(){

var p = window

while(p != p.parent){

p = p.parent

}

return p

}

1.session其实就是一个Map,键=值对,通过session.getAttribute("name")获得session中设置的参数

2.session的过期时间是从什么时候开始计算的?是从一登录就开始计算还是说从停止活动开始计算?

答:从session不活动的时候开始计算,如果session一直活动,session就总不会过期。

从该Session未被访问,开始计时一旦Session被访问,计时清0

3.设置session的失效时间

a)web.xml中

Xml代码

<session-config>

<session-timeout>30</session-timeout>

</session-config>

b)在程序中手动设置

session.setMaxInactiveInterval(30 * 60)//设置单位为秒,设置为-1永不过期

c)tomcat也可以修改session过期时间,在server.xml中定义context时采用如下定义:

Xml代码

<Context path="/livsorder" docBase="/home/httpd/html/livsorder"

defaultSessionTimeOut="3600" isWARExpanded="true"

isWARValidated="false" isInvokerEnabled="true"

isWorkDirPersistent="false"/>

4.如何判断session过没过期

request.getSeesion(boolean)方法,一下子让我恍然大悟。这个方法里面传了一个boolean值,这个值如果是true,那么如果当前的request的session不可用,那么就创建新的会话,如果存在就返回当前的会话。如果参数是false,那么在request的当前会话不存在的时候就返回null。

这样我们就可以很容易的联想到这个所谓的request的当前会话是否存在和session过期的联系,所以我们就可以“近似地”认为session不存在就是session过期了,那么我们就可以很容易地判断session是否过期了。方法如下:

if(request.getSession(false)==null)

System.out.println("Session has been invalidated!")

else

System.out.println("Session is active!")

可能大家注意到我上面有一个“近似地”字眼,也就是说存在特别情况。

这个特殊情况就是第一次请求还没有创建会话的时候,那么用这个方法返回的仍然是null,原因我想大家应该是显然的。

[java] view plain copy print?

private boolean checkSession( HttpServletRequest request,

HttpServletResponse response) {

HttpSession session = request.getSession(false)

String requestURI = request.getRequestURI()

String contextPath = request.getContextPath()

requestURI = requestURI.substring(contextPath.length())

if(requestURI.equals("/") ||

requestURI.equals("/login.jsp") ||

requestURI.equals("/login.do") ||

requestURI.equals(this.errorPage))

return true

if(session != null

&&session.getAttribute(this.objName) != null

&&session.getAttribute("year") != null)

return true

else

return false

}

比较好的一个办法

[java] view plain copy print?

//request.getSession(false)==null可以近似的判断是否过期:如果已经过期,那么返回的是null,但是当起一次请求,刚刚建立一个session的时候,上述方法也返回null

//所以应该这个做

if(null==request.getSession(false)){

if(true==request.getSession(true).isNew()){

}

else{

System.out.println("session已经过期")

}

}

解决方案有两个,但他们的基础都是修改CasDotNetClient的源代码,在SESSION失效的处理地方加上对AJAX请求的验证,然后针对AJAX请求SESSION失效的情况做特殊处理。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11609640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存