package org.hsweb.web.controller; import org.hsweb.web.core.datasource.DynamicDataSource; import org.hsweb.web.core.utils.ThreadLocalUtils; import org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.ui.context.support.ResourceBundleThemeSource; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ThemeResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.theme.CookieThemeResolver; import org.springframework.web.servlet.theme.ThemeChangeInterceptor; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Locale; /** * Created by zhouhao on 16-5-6. */ @Configuration @ComponentScan( basePackages = {"org.hsweb.web.controller"} ) public class ControllerAutoConfiguration extends WebMvcConfigurerAdapter { @Bean(name = "messageSource") public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource() { ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource(); reloadableResourceBundleMessageSource.setBasenames("classpath*:messages/", "classpath*:valid/validation"); reloadableResourceBundleMessageSource.setUseCodeAsDefaultMessage(false); reloadableResourceBundleMessageSource.setFallbackToSystemLocale(true); return reloadableResourceBundleMessageSource; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerInterceptor() { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { //ThreadLocalUtils.clear(); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { ThreadLocalUtils.clear(); DynamicDataSource.useDefault(); } }); ThemeChangeInterceptor themeChangeInterceptor = new ThemeChangeInterceptor() { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException { String newTheme = request.getParameter(getParamName()); if (newTheme != null) { ThemeResolver themeResolver = cookieThemeResolver(); if (themeResolver != null) { themeResolver.setThemeName(request, response, newTheme); } } return true; } }; LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor() { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException { String newLocale = request.getParameter(getParamName()); if (newLocale != null) { if (checkHttpMethod(request.getMethod())) { LocaleResolver localeResolver = cookieLocaleResolver(); if (localeResolver != null) { try { localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale)); } catch (IllegalArgumentException ex) { if (isIgnoreInvalidLocale()) { logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage()); } else { throw ex; } } } } } // Proceed in any case. return true; } private boolean checkHttpMethod(String currentMethod) { String[] configuredMethods = getHttpMethods(); if (ObjectUtils.isEmpty(configuredMethods)) { return true; } for (String configuredMethod : configuredMethods) { if (configuredMethod.equalsIgnoreCase(currentMethod)) { return true; } } return false; } }; localeChangeInterceptor.setHttpMethods("GET"); registry.addInterceptor(localeChangeInterceptor); registry.addInterceptor(themeChangeInterceptor); } @Bean(name = "localeResolver") public CookieLocaleResolver cookieLocaleResolver() { CookieLocaleResolver resolver = new CookieLocaleResolver(); resolver.setDefaultLocale(Locale.CHINA); return resolver; } @Bean public ResourceBundleThemeSource themeSource() { ResourceBundleThemeSource resourceBundleThemeSource = new ResourceBundleThemeSource(); resourceBundleThemeSource.setBasenamePrefix("theme."); return resourceBundleThemeSource; } @Bean(name = "themeResolver") public CookieThemeResolver cookieThemeResolver() { CookieThemeResolver cookieThemeResolver = new CookieThemeResolver(); cookieThemeResolver.setDefaultThemeName("default"); return cookieThemeResolver; } }