CookieLocaleResolver國際化語言標籤"-"和"_"

  • 在使用cookie信息完成國際化的項目中,摸索使用CookieLocaleResolver,我們調用Springboot爲我們集成的CookieLocaleResolver類,發現兩個項目生成的cookie的value不同。
  • 項目1:cookie: locale=zh_CN
  • 項目2:cookie: locale=zh-CN

  • 追蹤CookieLocaleResolver中的addCookie()方法:
 this.addCookie(response, (locale != null ? this.toLocaleValue(locale) : "-") 
   + (timeZone != null ? '/' + timeZone.getID() : ""));
  • 繼續查看this.toLocaleValue(locale)方法找到如下代碼:
  protected String toLocaleValue(Locale locale) {
        return this.isLanguageTagCompliant() ? locale.toLanguageTag() : locale.toString();
    }
  • 此時看到三元表達式通過isLanguageTagCompliant()決定使用toLanguageTag()ortoString()
  • 創建demo測試toLanguageTag()ortoString()的不同:
public String testLocale(){
        Locale locale = new Locale("zh","CN");
        return "toLanguageTag()方法:"+locale.toLanguageTag() +";toString()方法"+ locale.toString();
    }
  • 輸出內容:toLanguageTag()方法:zh-CN;toString()方法zh_CN

  • 此時我們知道了此處兩個項目使用的轉換字符串的方法不同,點開
    isLanguageTagCompliant()方法,看它是如何決定用那個方法的:
 public boolean isLanguageTagCompliant() {
        return this.languageTagCompliant;
    }
  • 查看languageTagCompliant值,是直接定義在CookieLocaleResolver類中但是不同的Spring-webmvc版本值是不同的:
    spring-webmvc-5.1.5.RELEASE.jar中:
private boolean languageTagCompliant = true;

spring-webmvc-5.0.9.RELEASE.jar中:

private boolean languageTagCompliant = false;

疑惑解決:不同的spring-webmvc版本默認轉換字符串的方式是不一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章