在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