在Ajax请求中处理登录session超时的方法


 

在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/

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM