Javascript可以判断页面是否是GET或POST的结果?

时间:2011-11-16 10:12:44

标签: javascript http post

  

可能重复:
  Client-side detection of HTTP request method

我正在处理在任何页面上注入的Javascript。脚本注入我无法控制的服务器上。 (使用附加组件或书签来完成注入。)

Javascript需要知道页面是否是作为HTTP GET或POST的结果而加载的。这样做的原因是,如果页面加载了GET,则URL是页面的标识符,可以加入书签,与其他人共享等。如果是POST,我需要以不同的方式处理它。

可以这样做吗?我发现无法从Javascript访问请求,但也许有一些我不知道的技巧。

2 个答案:

答案 0 :(得分:4)

我认为你不能。

Brendan Eich昨晚在他的推特上证实了in a conversation with dhh

在此处再现:

  

@dhh:在Ajax之外的浏览器中,JavaScript无法访问HTTP标头有什么原因吗?什么是历史原因?

     

@BrendanEich:@dhh @lostconvos没有充分理由 - 我过去没有时间(除了document.cookie和navigator.userAgent),没有人跟进。

     

@dhh:我们可以从xhr借用API:getResponseHeader()和getAllResponseHeaders()吗?

如果您对此事感兴趣,我建议您关注两者。

与此同时,我认为你能做的最好的就是拥有两个不同的javascripts - 一个用于POST页面,另一个用于其余的。您将两者都提供给提供者并告诉他们如何使用它们。但是,这涉及服务器的合作。

答案 1 :(得分:1)

无法直接检索网页的POST数据;想象一下,这是可能的。然后,也可以读取通过POST请求提交的敏感数据,这显然是不可取的。

如果您正在编写一个可以控制生成的HTML的扩展名/用户脚本,则可以使用method = post将查询字符串附加到每个表单元素。只有POST请求不是脚本化(AJAX),而是通过表单启动时,此方法才可靠。

示例代码:

javascript:(function(){
    var form = document.forms, i=form.length-1; 
    for(; i>=0; i--) {
        if(/post/i.test(form[i].method)) form[i].action += "#method-post";
    }
    //check whether the hash contains `#method-post`
    var is_post = location.hash.indexOf("#method-post") != -1;
    //Optionally, remove the hash to not interfere with the scripts at the page:
    //location.hash = location.hash.replace('#method-post', '');
})();

位置哈希不会提交给服务器,而是由浏览器传递。此解决方案适用于扩展,但对于bookmarklet可能不准确,因为用户应始终激活它。