【问题标题】:Tomcat ignores Accept-Language headerTomcat 忽略 Accept-Language 标头
【发布时间】:2017-11-21 19:57:11
【问题描述】:

在我的 Java 应用程序中,我将默认系统区域设置 (Locale.getDefault()) 设置为我的 tomcat Web 应用程序的 HTTP 请求的 Accept-Language 标头。 就我而言,这是de_DE

在服务器端,我尝试使用request.getLocale() 获取语言环境。但我只得到一个空字符串。

如果我将 Accept-Language 设置为 de,一切正常。

为什么de_DE 不能用作 Accept-Language 标头?

编辑:

这是我的客户端代码:

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestProperty("Accept-Language", Locale.getDefault().toString());

这是我的服务器端代码:

request.getLocale().toString(); //empty string
request.getHeader("Accept-Language"); //"de_DE"

【问题讨论】:

  • 这不能回答我的问题。问题(在我看来)不是 Java 返回错误的位置,而是 tomcat 无法识别 Accept-Language 标头中的 de_DE。
  • 你怎么知道问题出在Tomcat上?你试过其他服务器吗?你能给我们一些代码以便我们帮忙吗?

标签: java tomcat


【解决方案1】:

语言标签的正确格式是 de-DE。使用破折号,而不是下划线。

我想如果其他网络服务器更宽松并且接受 de_DE 是等价的,这并不奇怪,但 Tomcat 不会。作为参考,Tomcat 将此解析委托给 Locale.forLanguageTag(),这清楚地表明它需要格式 de-DE。

【讨论】:

  • 谢谢!这解决了这个问题。 Locale.getDefault().toString().replace('_', '-');
【解决方案2】:

正如 kumesana 所指出的,Tomcat 将使用 Locale.forLanguageTag() 将 Accept-Language 标头值转换为 Locale。有一种相反的方法可以将 Locale 实例转换为预期的标头字符串:toLanguageTag()

我建议使用它而不是手动将下划线替换为连字符,因此您的代码将如下所示:

connection.setRequestProperty("Accept-Language", Locale.getDefault().toLanguageTag());

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多