【发布时间】: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