今天同事碰到一个问题:当服务端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 = ;
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/140104/how-can-i-return-a-custom-http-status-code-from-a-wcf-rest-method

http://stackoverflow.com/questions/17477738/jquery-ajax-statuscode-methods-not-being-called

http://stackoverflow.com/questions/13936892/wcf-string-method-that-also-serves-a-download-with-response-write-only-working

jQuery Ajax 处理 HttpStatus的更多相关文章

  1. IE8/9 JQuery.Ajax 上传文件无效

    IE8/9 JQuery.Ajax 上传文件有两个限制: 使用 JQuery.Ajax 无法上传文件(因为无法使用 FormData,FormData 是 HTML5 的一个特性,IE8/9 不支持) ...

  2. jquery ajax解析

    jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...

  3. jQuery.ajax 根据不同的Content-Type做出不同的响应

    使用H5+ASP.NET General Handler开发项目,使用ajax进行前后端的通讯.有一个场景需求是根据服务器返回的不同数据类型,前端进行不同的响应,这里记录下如何使用$.ajax实现该需 ...

  4. jQuery.ajax(url,[settings])

    概述 通过 HTTP 请求加载远程数据. jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() 返回其创建的 XMLHttpRequest 对象. ...

  5. jQuery Ajax 实例 ($.ajax、$.post、$.get)

    jQuery Ajax 实例 ($.ajax.$.post.$.get) 转 Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的诧异了. ...

  6. jQuery Ajax传值给Servlet,在Servlet里Get接受参数乱码的解决方法

    最近在学jquery ui,在做一个小功能的时候需要将前台的值获取到,通过Ajax传递给Servlet,然后再在返回数据结果,但是在Servlet接受参数的时候,通过后台打印,发现接受乱码,代码示例如 ...

  7. JQuery+Ajax+Struts2+Hibernate 实现完整的登录注册

    写在最前: 下午有招聘会,不想去,总觉得没有准备好,而且都是一些不对口的公司,可是又静不下心来,就来写个博客. 最近在仿造一个书城的网站:http://www.yousuu.com ,UI直接拿来用, ...

  8. 用.NET MVC实现长轮询,与jQuery.AJAX即时双向通信

    两周前用长轮询做了一个Chat,并移植到了Azure,还写了篇博客http://www.cnblogs.com/indream/p/3187540.html,让大家帮忙测试. 首先感谢300位注册用户 ...

  9. jQuery AJAX 网页无刷新上传示例

    新年礼,提供简单.易套用的 jQuery AJAX 上传示例及代码下载.后台对文件的上传及检查,以 C#/.NET Handler 处理 (可视需要改写成 Java 或 PHP). 有时做一个网站项目 ...

随机推荐

  1. 烂泥:puppet添加带密码的用户

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 前一篇文章,我们介绍了有关puppet3.7的安装与配置,这篇文章我们再来介绍下如何利用puppet添加带密码的用户. 要通过puppet添加带密码的用 ...

  2. R语言学习笔记(二)

    今天主要学习了两个统计学的基本概念:峰度和偏度,并且用R语言来描述. > vars<-c("mpg","hp","wt") &g ...

  3. poj 2278 DNASequnce AC自动机

    地址:http://poj.org/problem?id=2778 题目: DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  4. Gvr SDK for Unity 分析(二)

    前言 关于google vr sdk的具体使用,传送门 Gvr SDK for Unity 分析(一) Google Daydream平台已经整合进Google VR SDK 本文环境:Unity5. ...

  5. [IPA]IOS In App Purchase(内购)验证

    参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...

  6. 读取另一个项目中方法的json

    A项目中的被调用方法: public class Eg1Action { public void save(){        write("{\"state\":1,\ ...

  7. ubuntu不能登录图形用户界面,游客身份可登陆,命令行可登陆

    ubuntu是13.04版本,我猜其他的版本解决办法大概也一样.当开机进入登陆界面后我们输入密码后并没有进入应该进入的图形用户界面,而是进入一个命令行界面并且一闪而过又回到了登录界面,而已游客的身份却 ...

  8. 深入了解Windows

    1.1.什么是WindowMicrosoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级, ...

  9. LazyInitializationException: could not initialize proxy no session

    这完全是框架设计者的锅,讲道理  无论是SSH SSM都太重了, Hibernate几乎把SQL完全封装了一遍,简单的一对多关系,如果开启LazyLoad 这样实体类会被代理,直到访问这个多方实体的属 ...

  10. 4种sql分页

    四种方式实现SQLServer 分页查询 SQLServer 的数据分页: 假设现在有这样的一张表:CREATE TABLE test( id int primary key not null ide ...