2021年1月14日星期四

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

下面是文档上的截图

如果对您有帮助请评论,点赞让我知道,谢谢!









原文转载:http://www.shaoqun.com/a/508843.html

跨境电商:https://www.ikjzd.com/

折扣网:https://www.ikjzd.com/w/74

new old stock:https://www.ikjzd.com/w/2341


网上很多的springboot国际化的文章都是正常情况下的使用方法如果你像我一样用了SpringSecurity那么在多语言的时候可能就会遇到一个深渊SpringSecurity里面的异常本身已经是做了多语言的,但是只支持通过Accept-Language来切换错误信息的语言而我们需要自定义异常信息,以及用url参数lang=en_US或者lang=cn_ZH来控制语言的话网上的这种方法是不行的@
extra:extra
空中云汇:空中云汇
最新!wish新出炉的2条公告,卖家必看!:最新!wish新出炉的2条公告,卖家必看!
口述:相亲男说娶我是为了给他爸妈养老:口述:相亲男说娶我是为了给他爸妈养老
如何在亚马逊上从调研、开发、销售、推广把一款产品做起来?:如何在亚马逊上从调研、开发、销售、推广把一款产品做起来?

没有评论:

发表评论