LocaleContextHolder 不会在 Spring Cloud Gateway 中返回确切的区域设置



无论如何可以在Spring Cloud Gateway中获取当前语言环境吗?我使用LocaleContextHolder.getLocale()来获取用户的区域设置,但它总是返回默认区域设置en。 感谢您的帮助!


@Component
public class ClientVersionGatewayFilterFactory extends AbstractGatewayFilterFactory<ClientVersionGatewayFilterFactory.Config> {
private final MessageSource messageSource;
public ClientVersionGatewayFilterFactory(MessageSource messageSource) {
super(Config.class);
this.messageSource = messageSource;
}
@Override
public GatewayFilter apply(Config config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
Locale locale = LocaleContextHolder.getLocale();
String message = messageSource.getMessage("test", null, locale);
exchange.getResponse().getHeaders().set("X-Custom-Locale", locale.getLanguage());
exchange.getResponse().getHeaders().set("X-Custom-Test", message);
return exchange.getResponse().setComplete();
}
};
}
public static class Config {
}
}

我找到了解决方法。

Locale locale = LocaleContextHolder.getLocale(exchange.getLocaleContext());
String message = messageSource.getMessage("test", null, locale);

有没有人有更好的解决方案?

因为 webflux 不支持 ThreadLocal,可以从 exchange 获取标头。 你可以定义一个全局过滤器,就像这样

@Component
public class LocaleFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
List<Locale> acceptLocales = exchange.getRequest().getHeaders().getAcceptLanguageAsLocales();
if (!CollectionUtils.isEmpty(acceptLocales)) {
LocaleContextHolder.setDefaultLocale(acceptLocales.get(0));
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}

最新更新