如何为Spring Boot的CookieLocaleResolver设置支持的区域语言?
CookieLocaleResolver本身没有提供像AcceptHeaderLocaleResolver那样的setSupportedLocales方法,但可以通过自定义解析逻辑实现对支持语言的校验,以下是两种可行方案:
方案一:继承CookieLocaleResolver重写resolveLocale方法
自定义LocaleResolver继承自CookieLocaleResolver,在解析Cookie中的locale后,校验其是否在支持列表内,若不在则回退到默认语言。
import org.springframework.web.servlet.i18n.CookieLocaleResolver; import jakarta.servlet.http.HttpServletRequest; import java.util.List; import java.util.Locale; public class SupportedCookieLocaleResolver extends CookieLocaleResolver { private List<Locale> supportedLocales; private Locale defaultLocale; public SupportedCookieLocaleResolver(String cookieName) { super(cookieName); } @Override public Locale resolveLocale(HttpServletRequest request) { // 从Cookie中获取locale Locale cookieLocale = super.resolveLocale(request); // 校验是否在支持列表中 if (supportedLocales != null && supportedLocales.contains(cookieLocale)) { return cookieLocale; } // 不在支持列表则使用默认语言 return defaultLocale != null ? defaultLocale : super.getDefaultLocale(); } // 提供设置支持语言的方法 public void setSupportedLocales(List<Locale> supportedLocales) { this.supportedLocales = supportedLocales; } @Override public void setDefaultLocale(Locale defaultLocale) { this.defaultLocale = defaultLocale; super.setDefaultLocale(defaultLocale); } }
配置类中使用自定义Resolver:
@Bean public LocaleResolver localeResolver() { var localeResolver = new SupportedCookieLocaleResolver("LANG"); localeResolver.setDefaultLocale(Locale.ENGLISH); localeResolver.setSupportedLocales(List.of(Locale.ENGLISH, Locale.GERMAN)); return localeResolver; }
方案二:通过DefaultLocaleFunction过滤语言
无需自定义类,直接在setDefaultLocaleFunction中添加校验逻辑,当Cookie中的语言不在支持列表时,回退到默认语言:
@Bean public LocaleResolver localeResolver() { var localeResolver = new CookieLocaleResolver("LANG"); Locale defaultLocale = Locale.ENGLISH; List<Locale> supportedLocales = List.of(Locale.ENGLISH, Locale.GERMAN); localeResolver.setDefaultLocale(defaultLocale); localeResolver.setDefaultLocaleFunction(request -> { // 手动解析Cookie中的语言 String cookieValue = WebUtils.getCookie(request, "LANG") != null ? WebUtils.getCookie(request, "LANG").getValue() : null; if (cookieValue != null) { Locale cookieLocale = StringUtils.parseLocale(cookieValue); if (supportedLocales.contains(cookieLocale)) { return cookieLocale; } } // 语言不支持时回退到默认值 return defaultLocale; }); return localeResolver; }
以上两种方案都能实现和AcceptHeaderLocaleResolver一致的效果:仅当Cookie中的语言在支持列表内时才会生效,否则自动回退到默认语言。
内容的提问来源于stack exchange,提问作者arok
相关产品推荐
相关产品推荐

