今天同事碰到一個問題:當服務端Session失效後用ajax請求數據,頁面端沒法提示和執行跳轉.我最早想到是,在後端用js輸出一個跳轉.發現輸出沒有效果,由於ajax是異步請求,javascript
須要在success函數中特殊處理才能起到做用.能夠在success函數中將處理代碼append到當前頁面中執行.java
js代碼jquery
$('#btnAshx').click(function () { $.ajax( { url: "/ASHX/AjaxHandler.ashx?action=Redirect", dataType: "text", success: function (data) { $('#divResult').append(data); } } ); });
後端代碼ajax
public class AjaxTest : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.Write("<script>window.location.href='Default.aspx'</script>"); } }
這樣處理的話有一個問題,須要對每個ajax請求作特殊處理才能讓頁面跳轉,可是session失效應該是統一處理.後來想到能夠利用ajax的error函數來處理這個問題,服務端製造請求錯誤.可是這樣又帶來了新的問題,若是有後臺特殊的錯誤提示須要返回,返回將被覆蓋.詳細查看ajax的api後發現其提供了statusCode的處理函數.那麼這樣能夠利用後天輸出http status來統一通知session失效的問題.後端
js代碼:api
$.ajaxSetup({ statusCode: { 400: function () { window.location.href = "Default.aspx"; } } });
後臺代碼:session
public class AjaxTest : IHttpHandler { public void ProcessRequest(HttpContext context) { //context.Response.Write("<script>window.location.href='Default.aspx'</script>"); context.Response.StatusCode = 400; context.Response.End(); } }
若是請求的是頁面,同httphandler的處理方式:app
JS:異步
$('#btnAspx').click(function () { $.ajax( { url: "AjaxTest.aspx?action=Redirect", dataType: "text", success: function (data) { //$('#divResult').append(data); } } ); });
後臺:函數
string action = Request.QueryString["action"]; if (action == "Redirect") {
//HttpContext.Current.Response.Write("<script type='text/javascript'>window.location.href='Default.aspx'</script>");
HttpContext.Current.Response.StatusCode = 400;
HttpContext.Current.Response.End();
}
若是請求的是WCF,直接使用Response.Write沒有效果,須要使用WebOperationContext類
JS:
$('#btnWcf').click(function () { $.ajax({ url: "WCF.svc/RedirectTest", dataType: "text", success: function (data) { // $('#divResult').append(data); } });
後臺:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class WCF { // 在此處添加更多操做並使用 [OperationContract] 標記它們 [WebGet()] public void RedirectTest() { ////HttpContext.Current.Response.Write("<script type='text/javascript'>window.location.href='Default.aspx'</script>"); //HttpContext.Current.Response.StatusCode = 400; //HttpContext.Current.Response.End(); WebOperationContext ctx = WebOperationContext.Current; ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.BadRequest; } }
在查找資料的時候,發現能夠經過服務端其餘方式來處理,不過這裏就不介紹了.
PS:注意jQuery1.4.1是不支持statusCode函數的.肯定jQuery版本是否支持.
參考:
http://stackoverflow.com/questions/17477738/jquery-ajax-statuscode-methods-not-being-called