我正在处理在任何页面上注入的Javascript。脚本注入我无法控制的服务器上。 (使用附加组件或书签来完成注入。)
Javascript需要知道页面是否是作为HTTP GET或POST的结果而加载的。这样做的原因是,如果页面加载了GET,则URL是页面的标识符,可以加入书签,与其他人共享等。如果是POST,我需要以不同的方式处理它。
可以这样做吗?我发现无法从Javascript访问请求,但也许有一些我不知道的技巧。
答案 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可能不准确,因为用户应始终激活它。