在Spring 4.0中获取请求的时区信息

时间:2014-12-29 12:44:10

标签: spring-mvc grails timezone

在Web请求对象中获取时区信息有一个新功能。见http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/mvc.html#mvc-timezone

中的16.9.1部分

但是我无法解决我们如何从请求中获取时区信息或我应该使用哪种方法来获取时区信息?

看完&按照https://github.com/spring-projects/spring-framework/blob/v4.0.7.RELEASE/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java#L242的源代码,我尝试手动打印

println WebUtils.getSessionAttribute(request, SessionLocaleResolver.class.getName() + ".TIME_ZONE")

任何帮助?

3 个答案:

答案 0 :(得分:10)

只需添加类型为TimeZone的方法参数即可获取它。

@RequestMapping
public String foo(TimeZone timezone) { ... }

应该这样做。

如果你真的想自己动手使用RequestContextUtils.getTimeZone(request)方法。

@RequestMapping
public String foo(HttpServletRequest request) {
    TimeZone timezone = RequestContextUtils.getTimeZone(request);
    ...
}

答案 1 :(得分:3)

我对此进行了一些调查,其中一个问题是没有默认的TimeZone设置,这似乎是一种疏忽;如果没有其他可用的话,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参考文档中使用TimeZone时,没有太多记录;实际上original feature request from 2005的评论中有更多信息。

Grails会覆盖LocaleResolver的默认AcceptHeaderLocaleResolver实现(不支持TimeZone),而是配置SessionLocaleResolver。这首先在会话中查找区域设置,然后在解析器上设置默认值(默认为null - 它未由Grails初始化),最后调用request.getLocale(),它会检查{{ 1}}标题。这通常是设置的,因为具有本地化文本是一件好事。此外,还配置了Accept-Language,用于查找" lang" param支持更改LocaleChangeInterceptor。但是没有从客户端传递时区信息的约定。

在我看来,时区ID就像您在用户注册期间要求的那样,并在数据库中存储其他个人资料信息。然后,当他们进行身份验证时,您可以使用存储的值(如果存在)并将其设置在Locale将找到它的会话中,例如。

LocaleResolver

可以在JavaScript中获取用户的本地时间和TimeZone,并通过Ajax将其发送到服务器。有关示例,请参阅links in this answer

答案 2 :(得分:1)

对于Spring Boot 2.x.x

@RequestMapping 
public String foo(TimeZone timezone) { ... }

它完美地工作。