在Web应用中,会用到大量的Ajax请求,在Ajax请求中存在的一个问题就是如何判断session超时,在网上找到的一个java中处理此问题方法:
1.java中:
public boolean preHandle(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:
<?php class Lby_Controller_Plugin_Ajax extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { if ($this->getRequest()->isXmlHttpRequest()) { //首先判断是否是Ajax请求 $user=new Zend_Session_Namespace("user"); //获取session if (!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,弹出一个登录的对话框,在当前页面完成异步登录的操作。
注:感谢ComingX提供技术支持:http://www.comingx.com/