Javascript 通过 Servlet 连接被 chop

标签 java javascript http servlets get

我已经编写了一个 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/

相关文章:

java.lang.IllegalAccessError : tried to access method com. google.common.util.concurrent.SimpleTimeLimiter 与 Selenium ChromeDriver Chrome 与 Java

java - SuperCSV 和推土机

java - 从 PDF 中删除页面

java - 我需要帮助找出我做错了什么

javascript - 由于 angularjs 1.4 中的类型不匹配,选择元素值未绑定(bind)

http - Slack Slash 命令获取 Gif 请求

javascript - 关闭多级 jquery 下拉菜单

javascript - 浏览器显示的图标在哈希更改时闪烁

javascript - 使用 localhost/同一主机的 http 模块获取请求

http - 从/到/home 重定向的最佳 HTTP 状态代码是什么?