Spring mvc 从Spring 4.0中的请求获取时区信息
在web请求对象中有一个获取时区信息的新特性。请参见中的第16.9.1节 但我无法解决如何从请求中获取时区信息,或者应该使用哪种方法获取时区信息 在查看并遵循源代码之后,我尝试手动打印它Spring mvc 从Spring 4.0中的请求获取时区信息,spring-mvc,grails,timezone,Spring Mvc,Grails,Timezone,在web请求对象中有一个获取时区信息的新特性。请参见中的第16.9.1节 但我无法解决如何从请求中获取时区信息,或者应该使用哪种方法获取时区信息 在查看并遵循源代码之后,我尝试手动打印它 println WebUtils.getSessionAttribute(request, SessionLocaleResolver.class.getName() + ".TIME_ZONE") 有什么帮助吗?只需添加一个时区类型的方法参数即可获得它 @RequestMapping public Stri
println WebUtils.getSessionAttribute(request, SessionLocaleResolver.class.getName() + ".TIME_ZONE")
有什么帮助吗?只需添加一个时区类型的方法参数即可获得它
@RequestMapping
public String foo(TimeZone timezone) { ... }
应该这样做
如果您真的想自己做,请使用RequestContextUtils.getTimeZone(request)
方法
@RequestMapping
public String foo(HttpServletRequest request) {
TimeZone timezone = RequestContextUtils.getTimeZone(request);
...
}
我仔细研究了一下,其中一个问题是没有默认的
时区设置,这似乎是一个疏忽RequestContextUtils.getTimeZone(request)
应该返回服务器的时区(如果没有其他可用的话)
这很容易修复;在BootStrap.groovy
中为“localeResolver”bean添加依赖项注入,并添加一些代码来设置解析器中的默认时区:
class BootStrap {
def localeResolver
def init = {
if (!localeResolver.defaultTimeZone) {
localeResolver.defaultTimeZone = TimeZone.getDefault()
// or hard-code to a known instance, e.g. TimeZone.getTimeZone('America/New_York')
}
}
}
Spring参考文档中没有太多关于使用时区的文档;事实上,在网站的评论中有更多的信息
Grails覆盖了默认的LocaleResolver
实现AcceptHeaderLocaleResolver
(它不支持时区
),而是配置一个会话LocaleResolver
。这将首先在会话中查找区域设置,然后查找解析程序上设置的默认值(默认为null-它不是由Grails初始化的),最后调用request.getLocale()
,检查Accept Language
头。这通常是设置的,因为本地化文本是一件好事。此外,还配置了一个LocaleChangeInterceptor
,用于查找“lang”参数以支持更改Locale
。但是没有从客户端传递时区信息的约定
时区id在我看来像是在用户注册期间需要的,并与其他配置文件信息一起存储在数据库中。然后,当他们进行身份验证时,您可以使用存储的值(如果存在),并在LocaleResolver
将找到它的会话中设置它,例如
import org.springframework.web.servlet.i18n.SessionLocaleResolver
...
session[SessionLocaleResolver.TIME_ZONE_SESSION_ATTRIBUTE_NAME] =
TimeZone.getTimeZone(user.timeZoneId)
可以用JavaScript获取用户的本地时间和时区,并通过Ajax将其发送到服务器。有关一些示例,请参见针对Spring Boot 2.x.x的。
@RequestMapping
public String foo(TimeZone timezone) { ... }
它工作得很好。谢谢Denium的回复。使用您的解决方案,我得到的是空值,所以我需要配置其他内容吗?支持取决于TimeZoneAwareLocaleContext
如何设置/配置,我还不清楚。但基本上,它使用Spring使用的机制来设置/确定时区。顺便说一句,我希望您已经收到您的机器/服务器的默认时区。您是否在配置中使用了
?不,实际上,我已经为此设置了任何特殊配置。我在一个Grails应用程序中使用它。啊,我错过了这一部分。您得到的null
这一事实让我相信使用的是旧的注释驱动的片段,而不是新的片段。更新的不应该返回null(当用作方法参数时),但如果找不到其他时区,则为您提供默认值。好的,我将尝试该解决方案。感谢Burt花时间。以前对于基于Grails的旧项目,我们使用基于javascript的方法进行ajax调用,为当前用户设置时区。我认为最新版本支持自动获取时区。但根据您的描述,目前实际上无法直接从请求中获取时区。