我已经编写了一个 Servlet,它应该像网络代理一样运行。但是,当我加载页面时,某些 Javascript GET 调用仅返回部分原始内容,例如 localhost:8080/Proxy?requestURL=example.com
。
当将java脚本的内容打印到控制台时,它们就完成了。 但浏览器的响应被 chop 。
我是这样写的:
ServletOutputStream sos = resp.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(sos);
..
String str = content_of_get_request
..
writer.write(str);
writer.flush();
writer.close();
奇怪的是,当我直接请求在页面请求期间加载的Javascript时,如下所示:
localhost:8080/Proxy?requestURL=anotherexaple.com/needed.js
全部内容返回到浏览器。
如果有人有想法那就太好了。 问候
更新:
问题在于我创建响应字符串的方式:
while ((line = rd.readLine()) != null)
{
response.append(line);
}
我从 Stream 中读取了一行并将其附加到 StringBuffer 上,但 Firefox 和 chrome 似乎对此有问题。 似乎有些浏览器为 JavaScript 实现了最大行长度,但是 RFC HTTP 1.1 标准中没有提到最大行长度。
修复:
只需在该行中添加“\n”即可解决问题。
response.append(line+"\n");
最佳答案
因为你所做的只是读取 Html Response ,但你实际上并没有调用 HTML 中引用的其他资源,如图像、js 等。
当您通过 Firebug for Firefox 监控浏览器如何呈现 html 时,您可以观察到这一点。
1)浏览器接收Html响应。
2)然后它解析引用的资源并为每个资源进行单独的 Get 调用。
因此,为了使代理正常工作,您需要模仿此浏览器行为。
我的建议是使用已经可用的开源库 HTML Unit
关于Javascript 通过 Servlet 连接被 chop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15290527/