Spring Boot Security 国际化 多语言 i18n 趟过巨坑

网上很多的spring boot国际化的文章都是正常情况下的使用方法

如果你像我一样用了Spring Security 那么在多语言的时候可能就会遇到一个深渊

Spring Security里面的异常本身已经是做了多语言的,但是只支持通过Accept-Language来切换错误信息的语言

而我们需要自定义异常信息,以及用url参数lang=en_US或者lang=cn_ZH来控制语言的话网上的这种方法是不行的

@Configurationpublic 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之后执行。

下面是文档上的截图

(0)

相关推荐