You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Spring Boot的CookieLocaleResolver设置支持的区域语言?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:43:31