在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,弹出一个登录的对话框,在当前页面完成异步登录的操作。