今天同事碰到一个问题:当服务端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