设置img src不会生成GET请求

时间:2016-05-25 12:17:05

标签: javascript html http python-3.x httpserver

我目前使用以下代码(供个人使用)使用Spotify Web API进行授权

import http.server
import urllib.parse
from subprocess import call

authQuery = {}
class queryStrHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        print("received a get request")
        urlComponents = urllib.parse.urlparse(self.path)
        if urlComponents[4] == "":
            print("sending payload")
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.end_headers()
            html = """<html><head><script type="text/javascript">
            alert("payload has been activated");
            var tokenSupplier = document.createElement("img");
            if(window.location.hash){
                var fragment = window.location.hash.substring(1);
                alert(fragment);
                tokenSupplier.src = "http://localhost:8888/?" + fragment;
                alert(tokenSupplier.src);
            }
            else {
                var queryStr = window.location.href.split('?')[1];
                tokenSupplier.src = "http://localhost:8888/?" + queryStr;
            } 
            </script></head><body></body></html>"""
            self.wfile.write(bytes(html, "utf-8"))
        else:
            print("receiving token or error")
            global authQuery
            authQuery = urllib.parse.parse_qs(urlComponents[4])

tokenFetcher = http.server.HTTPServer(('127.0.0.1', 8888), queryStrHandler)
authUrl = "https://accounts.spotify.com/authorize?" + urllib.parse.urlencode(
    {
        "client_id": "<ID here>",
        "redirect_uri": "http://localhost:8888/",
        "scope": "playlist-read-private user-library-read",
        "response_type": "token"
    }
)
call(["open", authUrl])
tokenFetcher.handle_request()
print(authQuery)

因为Spotify帐户服务的URL中的哈希片段在用户允许访问后将用户重定向到服务器(此脚本),所以当Accounts服务重定向时,我发送HTML / JS有效负载用户到localhost:8888,通过跟踪像素样式图像元素的源URL中的查询字符串,将包含访问令牌的哈希片段置于家中。发生这种情况时,应执行do_GET函数中的else分支。但是,设置图像元素的src似乎永远不会生成GET请求,因为我的脚本从不报告第二个GET请求,因此应该包含访问令牌的authQuery字典保持为空。奇怪的是,当我没有添加打开浏览器的代码(利用OS X'打开命令,在默认应用程序中打开URL或文件)的调用行时,但是手动浏览到http://localhost:8888/?aParameter=someValueHere “跟踪像素”确实有效!

我已经读过,由于浏览器的缓存行为设置图像的src可能不会生成GET请求,建议的解决方案是在src URL中添加一个唯一的参数以避免缓存,但这不是必需的就我而言,因为src URL中的Spotify Web API访问令牌已经是唯一的!

1 个答案:

答案 0 :(得分:0)

尝试设置src =“”,然后src =“http:// localhost:8888 /?aParameter = someValueHere”

编辑:

尝试从DOM中删除IMG元素,然后使用新的src重新添加它 在每次通话之间如此:

var img = document.createElement("img");
img.src = "http://localhost:8888/?aParameter=someValue_1";
ContainerElement.appendChild(img);

ContainerElement.removeChild(img);
img = null;
img = document.createElement("img");
img.src = "http://localhost:8888/?aParameter=someValue_2";
ContainerElement.appendChild(img);