【问题标题】:Keep the space after semicolon in Content-type header response using tomcat使用tomcat在Content-type header响应中保留分号后的空格
【发布时间】:2018-03-21 14:34:18
【问题描述】:

我们有一个 legacy 客户端使用部署在 tomcat 8.5 上的 servlet。 此旧版客户端正在等待此格式的内容类型标头响应(注意分号和“字符集”之间的空格):

Content-type: text/xml; charset=utf-8

然而,在服务器端,Tomcat 总是修剪这个空白,尽管我们在 servlet 中强制它:

response.setContentType("text/xml; charset=utf-8");

或者甚至在具有HttpServletResponseWrapper 的自定义扩展名的过滤器中,如this question 中所建议的那样。

无论我尝试什么,总是返回内容类型标头而不包含空格。

Content-type: text/xml;charset=utf-8

作为参考,我在tomcat官方documentation找到了这个:

Tomcat 删除 ';' 之间的空白字符和 'charset' 关键字

我知道http标准说分号后面的空格是可选的,正如其他SO post中提到的那样,但是由于有问题的客户端运行的是旧版本,我想知道是否有任何方法可以强制tomcat保留这个空白。

我正在考虑其他选择,例如修改 apache 或 nginx(在 tomcat 之上)中的内容类型标头,但如果可能的话,我更喜欢 tomcat 级别的解决方案。

任何帮助将不胜感激。

【问题讨论】:

  • 看起来source code for this part of tomcat 表示没有禁用它的选项
  • 嗨@zack6849!感谢您的评论。我看到了,但是由于 contentType 的 getter 和 setter 方法都是公共的,我想知道是否有任何解决方法来覆盖它们或类似的东西。无论如何,谢谢。
  • 如果您的旧客户端允许使用引号等特殊字符,您可以破坏硬编码修剪,但从您所说的客户端不允许这样做。 RFC 2616 说标头值中的 LWS 可以被一个 SPACE 替换,它并没有说标头值中的 SPACE 可以被删除。旧版客户只认错了一半。
  • 感谢@EugèneAdell。当您说“打破硬编码装饰”时,您是什么意思?老实说,我不确定旧版客户端是否允许引用,所以也许我应该尝试一下您的建议
  • @zack6849 显示了 Tomcat 的代码,其中 trim 函数删除了您需要的空间。我赞成他的评论。如果您使用 "SPACE_charset=..." 或 'SPACE_charset=...' 而不是 SPACE_charset=..,则 trim 函数不会执行任何操作,因为该值将不再以空格开头。

标签: java tomcat servlets http-headers tomcat8.5


【解决方案1】:

正如 cmets 中所发布的,这是我们无法避免的,因为它已在 tomcat source code 中硬编码

在我们的特定用例中,我们终于能够稍微改变一下 legacy-client,所以现在它可以处理标准格式的内容类型标头(没有空格)。

感谢@zack6849 指出这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2020-10-05
    相关资源
    最近更新 更多