【问题标题】:Remove http header using java servlet api使用 java servlet api 删除 http 标头
【发布时间】:2011-07-27 00:00:44
【问题描述】:

我们使用的是 IBM Websphere Application Server 6.1,浏览器是 Internet Explorer 8。

我们有一个动态生成 PDF 和 MS Word 文档的 java servlet。在第一次尝试时,一些用户说他们正在获得

“Internet Explorer 无法打开此站点。请求的站点不可用或找不到。请稍后再试。”

根据 Microsoft 支持文章 ID 323308
当您尝试通过 HTTPS (SSL) 打开 Microsoft Office 文档或 PDF 文档时,IE 失败并显示上述错误消息。 如果服务器发送“Cache-control:no-store”标头或发送“Cache-control:no-cache”标头,则会出现此问题。 对于 IE8,微软建议在用户 Windows XP 桌面上添加注册表项。这对我们来说不是很实用,因为我们不控制用户的桌面。 IE9、Firefox、Chrome 等不会发生这种情况。

根据PK20531 WAS 6.1 正在添加 Cache-Control: no-cache="set-cookie, set-cookie2" 和 Expires 响应中设置了 cookie 时的 HTTP 标头。

注意 - 我们没有在 servlet 中设置 cookie。 cookie 由单点登录软件设置。

在设置单点登录 (LTPA) cookie 并且 WAS 正在添加 IE 浏览器不喜欢的 HTTP 标头时的第一次尝试。

Java servlet api 是否提供删除 http 标头的方法?有没有使用Filter api去除http头的技术?

【问题讨论】:

  • Servlet 过滤器能够删除“Cache-contro:no-cache”。但我们决定使用 IBM HTTP Server (apache) mod_headers 删除,它也可以删除单个虚拟主机的标头。
  • 你能告诉我你是怎么解决的吗?
  • 请参阅下文了解我们如何解决它。编写servlet过滤器(见oracle.com/technetwork/java/filters-137243.html)并设置响应头为“Cache-control:no-cache”
  • 我试过这个 response.setHeader("Cache-Control", "max-age=0");。但它没有任何区别我仍然看到 Cache-Control: no-cache

标签: java servlets http-headers


【解决方案1】:

如果您从响应中删除 Cache-Control 标头,则您不会发送任何有关缓存的指令,因此缓存行为将是不可预测的。

最好将标题设置到别的东西,而不是删除它。大概您想在浏览器上为您的页面启用缓存。因此,您可以将这些行添加到您的 servlet 以在浏览器中启用缓存:

response.setHeader("Pragma", "cache");
response.setHeader("Cache-Control", "private, must-revalidate");

您也可以在Filter 中执行此操作,因为过滤器可以访问 HTTP 响应对象。但是,如果您已经编写了自己的 servlet,那么在 servlet 中编写可能会更有效——也更清晰。

【讨论】:

  • 应用服务器正在设置缓存控制:无缓存。我尝试在 servlet resp.addHeader("Cache-Control", "max-age=0");现在 http 标头是 Cache-Control: max-age=0, no-cache.
  • 刚刚意识到应该使用 setHeader() 而不是 addHeader()
  • 当你使用setHeader()时发生了什么?当你使用addHeader() 时,你会得到 Cache-Control: max-age=0, no-cache 是有道理的——但我认为setHeader() 很好。你实际看到了什么?
  • 使用 addHeader() 得到“Cache-Control: no-cache, max-age=0”,使用 setHeader() 得到“Cache-Control: max-age=0, no-cache”,因为WAS 正在添加无缓存。
【解决方案2】:

这一切都由你控制。如果你不把它放在那里,就没有什么可以删除的。

【讨论】:

  • 更愿意对应用程序代码进行本地化更改,而不是对应用程序服务器进行配置更改,因为这可能会影响在其中运行的其他应用程序。
猜你喜欢
  • 1970-01-01
  • 2013-04-26
  • 2010-12-28
  • 2022-10-06
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2016-02-02
相关资源
最近更新 更多