Spring Boot Security 國際化 多語言 i18n 趟過巨坑


網上很多的spring boot國際化的文章都是正常情況下的使用方法

如果你像我一樣用了Spring Security 那么在多語言的時候可能就會遇到一個深淵

Spring Security里面的異常本身已經是做了多語言的,但是只支持通過Accept-Language來切換錯誤信息的語言

而我們需要自定義異常信息,以及用url參數lang=en_US或者lang=cn_ZH來控制語言的話網上的這種方法是不行的

@Configuration
public class I18nConfig implements WebMvcConfigurer {
    @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver slr = new CookieLocaleResolver();
        slr.setCookieName("locale");
        // 默認使用的語言
        slr.setDefaultLocale(Locale.US);
        return slr;
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        // 參數名 用於區別使用語言類型
        lci.setParamName("lang");
        return lci;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

重點來了
原因是Spring Security早於DispatcherServlet,Spring Security異常退出的時候都還沒有執行上面代碼加入的東西,所以是沒有成功的修改locale.

而我自己在結果過程中手動設置locale也遇到了一個坑
我在打印日志的Filter中加入了LocaleContextHolder.setLocale(StringUtils.parseLocale(newLocale)); 然后在打印的時候語言還是不對。
這個問題是因為我的filter的ordered太早了,所以后面被RequestContextFilter給設置回去了。

所以
解決辦法是在RequestContextFilter后面設置locale才對。

String newLocale = request.getParameter("lang");
if (StringUtils.isNotBlank(newLocale)) {
      LocaleContextHolder.setLocale(StringUtils.parseLocale(newLocale));
}

這個代碼要再RequestContextFilter之后執行。

下面是文檔上的截圖

如果對您有幫助請評論,點贊讓我知道,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM