【问题标题】:Is there a generic way of accessing JSON.parse XMLHTTPRequest.responseText?是否有访问 JSON.parse XMLHTTPRequest.responseText 的通用方法?
【发布时间】:2015-04-23 18:36:41
【问题描述】:

我有一个简单的 ASP.NET Web 应用程序,其中包含在输入的 onblur 事件上运行的以下 javascript:

function checkUserName() {
    var request = new XMLHttpRequest();
    if (request == null) {
        alert("Unable to create request.");
    } else {
        var theName = document.getElementById("username").value;
        var userName = encodeURIComponent(theName); 
        var url = "Default.aspx/CheckName?name='" + theName + "'";
        request.onreadystatechange = createStateChangeCallback(request);
        request.open("GET", url, true);
        request.setRequestHeader("Content-Type", "application/json");       
        request.send();
    }
}

此调用的 C# 方法如下:

[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static string CheckName(string name)
{
   return name + " modified backstage";
}

XMLHttpRequest 的 javascript 回调如下:

function createStateChangeCallback(request) {
    return function () { 
        if (request.readyState == 4) {
            var parsed = JSON.parse(request.responseText);
            alert(parsed.d);           
        }
    }
}

虽然这显示了我的服务器端方法的结果,但我想知道我需要访问该属性“d”以获得结果。我仅通过使用 Intellisense 才发现这一点。这个属性是访问解析后的 JSON 的标准属性吗?我应该以其他方式解决吗? “d”是任意的还是以某种方式确定的?我是否可以设置属性的名称,无论是客户端还是服务器端?

【问题讨论】:

  • @adeneo:是的,它按预期被调用了。
  • 是的,我没有注意到函数马上返回一个函数,花了我一秒钟。
  • 并且没有标准可以在返回的对象上设置d 属性,一定是其他添加它的东西吗?
  • 似乎您的服务器正在将有效负载包装到d

标签: javascript c# asp.net json


【解决方案1】:

关于以下几点:

var parsed = JSON.parse(request.responseText);
alert(parsed.d);  

d 是来自服务器通过GET 请求发送的响应对象的实际属性。它不是从 JSON.parse() 方法创建的特殊属性。

服务器很可能将返回数据对象包装到d 中。因此,响应对象类似于{ d: stuff },其中stuff 是返回的数据。

--编辑-- 在对此稍加研究之后,ASP.NET 和 WCF 端点将 JSON 对象格式化为 d 属性,以防止 CSRF 和 XSS 攻击。欲了解更多信息,请访问http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/

【讨论】:

    【解决方案2】:

    .d 是由 ASP.NET 在 System.Web.Extensions 命名空间下的框架代码中添加的,并且它是硬编码的,所以不,很遗憾您无法更改它。它的存在是为了减轻 XSS 攻击。不过,从好的方面来说,您可以指望.d 始终在场。

    【讨论】:

    • 它是为了防止 CSRF 攻击,而不是 XSS 攻击。它们听起来有点相似,但又有所不同。
    • 感谢您的信息。我给了 Boombox 的答案,因为他比你早了几分钟,但你们俩都很有帮助。
    • @boombox 取决于攻击。来自 odata.org:“名称/值对的名称始终为“d”,并且该值是 OData 资源的 JSON 表示,如本文档的小节所述。此模式确保从 OData 服务返回的 JSON 有效负载是有效的JSON 语句,但不是有效的 JavaScript 语句。这可以防止由于跨站点脚本 (XSS) 攻击而执行 OData JSON 响应。"
    • @RobC 你有什么理由手动滚动它吗?使用 jQuery 可以为自己节省一些精力,如果您对 ScriptManager 使用得心应手的话,甚至可以节省更多精力。
    • @moarboilerplate 啊,这是有道理的。谢谢。我的错。
    【解决方案3】:

    不。恐怕不是标准的 xmlhttprequest 对象是为 XML/HTML 设计的,所以恐怕你需要从原始文本中解析 json。

    不过,新的 XHR2 规范确实可以处理其他响应类型(如果您的浏览器支持 mimd)。

    http://www.html5rocks.com/en/tutorials/file/xhr2/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多