java和ajax超时_在Ajax请求中处理登录session超时的方法

在Web应用中,会用到大量的Ajax请求,在Ajax请求中存在的一个问题就是如何判断session超时,在网上找到的一个java中处理此问题方法:

1.java中:

public booleanpreHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception

{if (request.getSession().getAttribute("user") == null)//判断session里是否有用户信息

{if (request.getHeader("x-requested-with") != null&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest"))//如果是ajax请求响应头会有,x-requested-with;

{

response.setHeader("sessionstatus", "timeout");//在响应头设置session状态

return false;

}

}return true;

}//全局的ajax访问,处理ajax清求时sesion超时

$.ajaxSetup({

contentType:"application/x-www-form-urlencoded;charset=utf-8",

complete:function(XMLHttpRequest,textStatus){var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); //通过XMLHttpRequest取得响应头,sessionstatus,

if(sessionstatus=="timeout"){ //如果超时就处理 ,指定要跳转的页面

window.location.replace("${path}/common/login.do");

}

}

}

});

2.由于我的项目是Zend Framework,下面贴上zf中的解决方法

首先要在Controller_Plugin中定义,添加自定义的header:

{publicfunction preDispatch(Zend_Controller_Request_Abstract $request)

{if ($this->getRequest()->isXmlHttpRequest()) { //首先判断是否是Ajax请求

$user=new Zend_Session_Namespace("user"); //获取sessionif (!isset($user->user)) { //不存在,说明超时

$this->getResponse()->setHeader("sessionStatus", "timeout");

}else{ //存在

$this->getResponse()->setHeader("sessionStatus", "timeall");

}

}

}

}

然后在js中:

$(document).ready(function(){$.ajaxSetup({

complete:function(XMLHttpRequest){var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus");if(sessionstatus=="timeout"){

window.location.replace("${path}/user/user/login"); //跳转到登录界面,待改进

}

}

});});

总结:

1.主要是利用了Jquery的 $.ajaxSetup()全局设置选项。既然是全局默认选项,所以,该项中设置的参数会影响所有的$.ajax请求如$.get()    $.post()   $.ajax等。

2.同时需要在服务器端设置自定义header头,session超时当然也要在服务端判断。自定义header头其实在其中只是充当了一个信使的职责:服务端发信,客户端收信。

3.这样做存在一个极大的弊端:当用户提交一个表单的时候(当然是用ajax提交),恰好此时session已经超时,跳到登录界面。问题来了,这样做就会造成用户填写信息丢失,必须

登录后再填写一次。

4.解决方案:超时处理不采用跳转方法,而是直接dialog,弹出一个登录的对话框,在当前页面完成异步登录的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值