Spring Boot 2项目中如何在AOP的@After切面方法内获取客户端时区
实现方案
完全可以在现有AOP切面中获取客户端时区,具体实现逻辑如下:
- 首先通过Spring自带的
RequestContextHolder工具类获取当前HTTP请求上下文,拿到HttpServletRequest实例 - 调用你查到的
RequestContextUtils.getTimeZone()方法即可解析出客户端时区
完整代码示例
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.TimeZone; @Aspect @Component public class AuditAspect { @Pointcut("@annotation(auditEvent)") public void runAuditMethod(AuditEvent auditEvent) {} @After("runAuditMethod(auditEvent)") public void auditMethod(JoinPoint joinPoint, AuditEvent auditEvent) throws Throwable { // 获取请求上下文属性 ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); // 兼容非HTTP请求的场景,避免空指针 if (requestAttributes == null) { return; } HttpServletRequest request = requestAttributes.getRequest(); // 解析客户端时区 TimeZone clientTimeZone = RequestContextUtils.getTimeZone(request); // 此处添加你自己的时区记录逻辑 } }
注意事项
- 默认逻辑下
RequestContextUtils.getTimeZone()会从请求的Accept-Language头中解析时区,如果客户端未传递该头,会默认返回服务端所在时区- 如果你的客户端通过自定义请求头(比如
X-Timezone)传递时区标识,你可以直接从HttpServletRequest中取出对应头的值自行解析- 上述实现依赖Spring的请求上下文绑定,如果你用的是异步线程处理请求,需要提前配置请求上下文的透传,否则可能拿不到
requestAttributes
内容的提问来源于stack exchange,提问作者Lolly
相关产品推荐
相关产品推荐

