【问题标题】:Javascript truncated over Servlet ConnectionJavascript 在 Servlet 连接上被截断
【发布时间】:2013-02-23 19:01:36
【问题描述】:

我编写了一个 Servlet,它应该像一个网络代理。但有些 Javascript GET 调用仅在我加载页面时返回部分原始内容,例如 localhost:8080/Proxy?requestURL=example.com

将 java 脚本的内容打印到控制台时,它们是完整的。 但是浏览器的响应被截断了。

我是这样写的:

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");

【问题讨论】:

  • 也许你需要flush()close()作者?你这样做吗? Javadoc
  • 您是否验证了str包含所有预期的内容,例如通过将其打印到 Java 控制台?
  • Content-Type 标头的值是否正确?

标签: java javascript http servlets get


【解决方案1】:

因为您所做的只是读取 Html 响应,但实际上并没有调用 HTML 中引用的其他资源,例如图像、js 等。

当您通过 Firebug for Firefox 监控浏览器如何呈现 html 时,您可以观察到这一点。

1) 浏览器收到 Html 响应。

2)然后它解析引用的资源并为每个资源单独调用 Get。

因此,为了让代理工作,您需要模仿这种浏览器行为。

我的建议是使用已经可用的开源库 HTML Unit

【讨论】:

  • 为什么我的代理应该像浏览器一样工作?我只重定向一个get请求,并替换内容内的所有链接和src标签并将其返回给浏览器。浏览器将自行执行所有请求。并且对于大多数可以正常工作的网页。
  • 这取决于您如何实现代理。现在您已经澄清了,您是否检查过 Urls 确实是从浏览器 End 触发的,您可以通过像 Firebug 插件这样的插件来检查,以防您使用 firefox
  • 200 用于 javascript get 调用
  • 可能是因为浏览器缓存。当您从浏览器将其保存为 html 文件时会发生什么情况。会在本地下载js文件吗?
  • 也考虑关闭浏览器缓存,请检查这个 SO :stackoverflow.com/questions/1341089/…
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2017-08-31
  • 1970-01-01
相关资源
最近更新 更多