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