今天同事碰到一個問題:當服務端Session失效后用ajax請求數據,頁面端無法提示和執行跳轉.我最先想到是,在后端用js輸出一個跳轉.發現輸出沒有效果,因為ajax是異步請求,
需要在success函數中特殊處理才能起到作用.可以在success函數中將處理代碼append到當前頁面中執行.
js代碼
$('#btnAshx').click(function () { $.ajax( { url: "/ASHX/AjaxHandler.ashx?action=Redirect", dataType: "text", success: function (data) { $('#divResult').append(data); } } ); });
后端代碼
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代碼:
$.ajaxSetup({ statusCode: { 400: function () { window.location.href = "Default.aspx"; } } });
后台代碼:
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的處理方式:
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