Spring WebFlux中如何从ServerRequest获取时区?
在Spring WebFlux中从ServerRequest获取时区的方法
Spring WebFlux并没有提供和传统Spring MVC中RequestContext.getTimeZone(request)完全对应的直接方法,但可以通过以下几种方式实现从请求中获取时区:
从请求头解析时区
多数客户端会通过Time-Zone、X-Time-Zone这类自定义请求头传递时区信息,你可以直接从ServerRequest的请求头中读取并转换为ZoneId:public Mono<ZoneId> getTimeZoneFromRequest(ServerRequest request) { return Mono.justOrEmpty(request.headers().firstHeader("Time-Zone")) .map(ZoneId::of); }考虑到头信息可能存在格式错误的情况,建议添加异常处理,默认返回系统时区:
public Mono<ZoneId> getTimeZoneFromRequest(ServerRequest request) { return Mono.justOrEmpty(request.headers().firstHeader("Time-Zone")) .map(zone -> { try { return ZoneId.of(zone); } catch (DateTimeException e) { return ZoneId.systemDefault(); } }) .defaultIfEmpty(ZoneId.systemDefault()); }通过LocaleContext获取
如果你已经配置了WebFlux版本的LocaleContextResolver(比如CookieLocaleContextResolver或AcceptHeaderLocaleContextResolver),可以通过ServerWebExchange获取LocaleContext,进而提取时区:public Mono<ZoneId> getTimeZoneFromExchange(ServerWebExchange exchange) { return Mono.justOrEmpty(exchange.getLocaleContext().getTimeZone()) .map(TimeZone::toZoneId) .defaultIfEmpty(ZoneId.systemDefault()); }注:
ServerRequest可通过ServerWebExchange获取,也可以在HandlerFunction中直接注入ServerWebExchange实例。自定义请求上下文传递
如果需要在整个请求处理链路中共享时区信息,可以将解析后的ZoneId存入ServerWebExchange的属性中,后续处理环节直接从属性中读取:// 在过滤器或处理方法中设置时区属性 exchange.getAttributes().put("REQUEST_TIME_ZONE", zoneId); // 在后续处理中获取时区 ZoneId zoneId = (ZoneId) exchange.getAttribute("REQUEST_TIME_ZONE");
内容的提问来源于stack exchange,提问作者Oleksandr Onopriienko
相关产品推荐
相关产品推荐

