package com.vci.starter.web.interceptor; import com.vci.starter.web.constant.TokenKeyConstant; import com.vci.starter.web.enumpck.LangCodeEnum; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.lang.Nullable; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.support.RequestContextUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Locale; /** * 本地化控制拦截器 * @author weidy * @date 2019/11/7 12:22 PM */ public class VciLocaleInterceptor implements HandlerInterceptor { /** * 日志对象 */ protected final Logger logger = LoggerFactory.getLogger(getClass()); /** * 执行拦截 * @param request 请求对象 * @param response 相应对象 * @param handler 处理器 * @return 是否成功,false表示失败,其他的拦截器将不会执行 * @throws Exception 执行出错时会抛出异常 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //从参数或者头里获取 String newLocale = request.getParameter(TokenKeyConstant.LANGUAGE_KEY); if(StringUtils.isBlank(newLocale)){ newLocale = request.getHeader(TokenKeyConstant.LANGUAGE_KEY); if(logger.isDebugEnabled() && StringUtils.isNotBlank(newLocale)) { logger.debug("本地化参数在数据头中存放,当前是被调用的服务。{}", newLocale); } // if(StringUtils.isBlank(newLocale)){ // newLocale = LangCodeEnum.ZH_CN.getValue(); // } } //如果没有传递就不设置,因为多语言有默认值 if (StringUtils.isNotBlank(newLocale)) { LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request); if (localeResolver == null) { throw new IllegalStateException( "No LocaleResolver found: not in a DispatcherServlet request?"); } try { localeResolver.setLocale(request, response, parseLocaleValue(newLocale)); if(logger.isDebugEnabled()) { logger.debug("本地化为{}", newLocale); } }catch (IllegalArgumentException ex) { if(logger.isDebugEnabled()) { logger.debug("Ignoring invalid locale value [{}]:{} " ,newLocale,ex.getMessage()); } } } return true; } /** * 根据语言的编码获取本地化对象 * @param localeValue 本地化编码 * @return 本地化对象 */ @Nullable protected Locale parseLocaleValue(String localeValue) { return org.springframework.util.StringUtils.parseLocale(localeValue); } }