LocaleResolver
public interface LocaleResolver {
Locale resolveLocale(HttpServletRequest var1);
void setLocale(HttpServletRequest var1, @Nullable HttpServletResponse var2, @Nullable Locale var3);
}
它的作用是使用request解析出Locale,结构图如下所示:
- AcceptHeaderLocaleResolver直接使用了Header里的“acceptlanguage”的值,不可以在程序中修改;
- FixedLocaleResolver用于解析出固定的Locale,也就是说在创建好了就不能修改了;
- SessionLocaleResolver用于将Locale保存到Session中;
- CookieLocaleResolver用于将Locale保存到Cookie中;
其中在AbstractLocaleContextResolver下的子类添加了对TimeZone时区的支持。
1. AcceptHeaderLocaleResolver
public Locale resolveLocale(HttpServletRequest request) {
Locale defaultLocale = this.getDefaultLocale(); //查找默认的Locale
if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
return defaultLocale;
} else {
//请求中的Locale
Locale requestLocale = request.getLocale();
//获取能支持的Locale
List<Locale> supportedLocales = this.getSupportedLocales();
if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {
//两者匹配匹配成功
Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);
if (supportedLocale != null) {
return supportedLocale;
} else {
return defaultLocale != null ? defaultLocale : requestLocale;
}
} else {
return requestLocale;
}
}
}
public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) {
throw new UnsupportedOperationException("Cannot change HTTP accept header - use a different locale resolution strategy");
}
2.FixedLocaleResolver
public class FixedLocaleResolver extends AbstractLocaleContextResolver {
public FixedLocaleResolver() {
this.setDefaultLocale(Locale.getDefault());
}
public FixedLocaleResolver(Locale locale) {
this.setDefaultLocale(locale);
}
public FixedLocaleResolver(Locale locale, TimeZone timeZone) {
this.setDefaultLocale(locale);
this.setDefaultTimeZone(timeZone);
}
public Locale resolveLocale(HttpServletRequest request) {
Locale locale = this.getDefaultLocale();
if (locale == null) {
//使用默认值
locale = Locale.getDefault();
}
return locale;
}
public LocaleContext resolveLocaleContext(HttpServletRequest request) {
//使用默认的值Locale和TimeZone
return new TimeZoneAwareLocaleContext() {
@Nullable
public Locale getLocale() {
return FixedLocaleResolver.this.getDefaultLocale();
}
public TimeZone getTimeZone() {
return FixedLocaleResolver.this.getDefaultTimeZone();
}
};
}
public void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable LocaleContext localeContext) {
throw new UnsupportedOperationException("Cannot change fixed locale - use a different locale resolution strategy");
}
}
3.SessionLocaleResolver
这个和FixedLocaleResolver的实现差不多,只不过把默认值改成了从Session中获取,如果获取不到还是从默认值谋取,另外这里支持对LocaleContext的修改。
public Locale resolveLocale(HttpServletRequest request) {
//首先从session中获取
Locale locale = (Locale)WebUtils.getSessionAttribute(request, this.localeAttributeName);
if (locale == null) {
//获取不到获取默认值
locale = this.determineDefaultLocale(request);
}
return locale;
}
public LocaleContext resolveLocaleContext(final HttpServletRequest request) {
return new TimeZoneAwareLocaleContext() {
public Locale getLocale() {
Locale locale = (Locale)WebUtils.getSessionAttribute(request, SessionLocaleResolver.this.localeAttributeName);
if (locale == null) {
locale = SessionLocaleResolver.this.determineDefaultLocale(request);
}
return locale;
}
@Nullable
public TimeZone getTimeZone() {
TimeZone timeZone = (TimeZone)WebUtils.getSessionAttribute(request, SessionLocaleResolver.this.timeZoneAttributeName);
if (timeZone == null) {
timeZone = SessionLocaleResolver.this.determineDefaultTimeZone(request);
}
return timeZone;
}
};
}
public void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable LocaleContext localeContext) {
Locale locale = null;
TimeZone timeZone = null;
if (localeContext != null) {
locale = localeContext.getLocale();
if (localeContext instanceof TimeZoneAwareLocaleContext) {
timeZone = ((TimeZoneAwareLocaleContext)localeContext).getTimeZone();
}
}
WebUtils.setSessionAttribute(request, this.localeAttributeName, locale);
WebUtils.setSessionAttribute(request, this.timeZoneAttributeName, timeZone);
}
4.CookieLocaleResolver
它和SessionLocaleResolver类似,只是将Session编程Cookie来保存属性了额,只是为了处理Cookie继承了CookieGenerator,所以就没有继承AbstractLocaleContextResolver了,不过任然会提供保存默认的Locale和TimeZone的属性。