diff --git a/common/src/main/java/com/jeesite/common/utils/LocaleUtils.java b/common/src/main/java/com/jeesite/common/utils/LocaleUtils.java new file mode 100644 index 00000000..859c89a7 --- /dev/null +++ b/common/src/main/java/com/jeesite/common/utils/LocaleUtils.java @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + * No deletion without permission, or be held responsible to law. + */ +package com.jeesite.common.utils; + +import com.jeesite.common.io.PropertiesUtils; +import com.jeesite.common.web.http.ServletUtils; +import org.springframework.context.i18n.TimeZoneAwareLocaleContext; +import org.springframework.core.NamedThreadLocal; +import org.springframework.web.servlet.LocaleContextResolver; + +import javax.servlet.http.HttpServletRequest; +import java.util.Locale; +import java.util.TimeZone; + +/** + * 本地化工具 + * @author ThinkGem + * @version 2025-05-21 + */ +public class LocaleUtils { + + private static final Boolean LANG_ENABLED = PropertiesUtils.getInstance().getPropertyToBoolean("lang.enabled", "false"); + private static final ThreadLocal timeZoneAwareLocaleContext = new NamedThreadLocal<>("TimeZoneAwareLocaleContext"); + private static LocaleContextResolver localeResolver; + + /** + * 获取当前 Locale 对象,获取顺序:请求 -> 会话 -> Cookie -> lang.defaultLocale + */ + public static Locale getLocale() { + return getTimeZoneAwareLocaleContext().getLocale(); + } + + /** + * 获取当前 TimeZone 对象,获取顺序:请求 -> 会话 -> Cookie -> lang.defaultTimeZone + */ + public static TimeZone getTimeZone() { + return getTimeZoneAwareLocaleContext().getTimeZone(); + } + + /** + * 获取 TimeZoneAwareLocaleContext + */ + public static TimeZoneAwareLocaleContext getTimeZoneAwareLocaleContext() { + TimeZoneAwareLocaleContext context = timeZoneAwareLocaleContext.get(); + if (context != null){ + return context; + } + if (LANG_ENABLED && localeResolver != null){ + HttpServletRequest request = ServletUtils.getRequest(); + if (request != null){ + context = (TimeZoneAwareLocaleContext)localeResolver.resolveLocaleContext(request); + } + } + if (context == null){ + context = new TimeZoneAwareLocaleContext() { + @Override + public Locale getLocale() { + return Locale.getDefault(); + } + @Override + public TimeZone getTimeZone() { + return TimeZone.getDefault(); + } + }; + } + setTimeZoneAwareLocaleContext(context); + return context; + } + + /** + * 设置 TimeZoneAwareLocaleContext + */ + public static void setTimeZoneAwareLocaleContext(TimeZoneAwareLocaleContext context) { + timeZoneAwareLocaleContext.set(context); + } + + /** + * 清理本地线程对象(请求结束时调用) + */ + public static void removeTimeZoneAwareLocaleContext() { + timeZoneAwareLocaleContext.remove(); + } + + /** + * 设置 LocaleContextResolver + */ + public static void setLocaleResolver(LocaleContextResolver localeResolver) { + LocaleUtils.localeResolver = localeResolver; + } + +} diff --git a/modules/core/src/main/java/com/jeesite/modules/config/web/IpAddrFilterConfig.java b/modules/core/src/main/java/com/jeesite/modules/config/web/IpAddrFilterConfig.java index 0dc7bc47..912ff815 100644 --- a/modules/core/src/main/java/com/jeesite/modules/config/web/IpAddrFilterConfig.java +++ b/modules/core/src/main/java/com/jeesite/modules/config/web/IpAddrFilterConfig.java @@ -6,11 +6,13 @@ package com.jeesite.modules.config.web; import com.jeesite.common.config.Global; import com.jeesite.common.lang.StringUtils; +import com.jeesite.common.utils.LocaleUtils; import com.jeesite.common.web.http.ServletUtils; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; +import org.springframework.web.servlet.LocaleContextResolver; import javax.servlet.Filter; import javax.servlet.ServletRequest; @@ -28,7 +30,7 @@ public class IpAddrFilterConfig { private static String[] denyPrefixes; @Bean - public FilterRegistrationBean ipAddrFilter() { + public FilterRegistrationBean ipAddrFilter(LocaleContextResolver localeResolver) { FilterRegistrationBean bean = new FilterRegistrationBean<>(); bean.setName("ipAddrFilter"); bean.setOrder(Ordered.HIGHEST_PRECEDENCE + 10); @@ -40,7 +42,9 @@ public class IpAddrFilterConfig { response.setStatus(403); ServletUtils.renderString(response, Global.getText("访问拒绝")); } + LocaleUtils.removeTimeZoneAwareLocaleContext(); }); + LocaleUtils.setLocaleResolver(localeResolver); bean.addUrlPatterns("/*"); return bean; }