springboot如何获取前端请求头的值并加入ThreadLocal

依赖:

<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.9.7</version>
</dependency>

示例:

public class ThreadLocalUtil {
    private static ThreadLocal<String> aaHeaderValueThreadLocal = new ThreadLocal<>();

    public static void setAAHeaderValue(String aaHeaderValue) {
        aaHeaderValueThreadLocal.set(aaHeaderValue);
    }

    public static String getAAHeaderValue() {
        return aaHeaderValueThreadLocal.get();
    }

    public static void clear() {
        aaHeaderValueThreadLocal.remove();
    }
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

public class HttpServletRequestUtil {

    public static String getAAHeaderValue() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        return request.getHeader("aaHeader");
    }
}
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class RequireXXAspect {

    @Pointcut("@annotation(com.mySpringSecurity.mySpringSecurity.aspect.MyAnnotation)")
    public void myAnnotationMethod() {
    }

    @Before("myAnnotationMethod() && @annotation(requireXX)")
    public void beforeMethodWithRequireXX(JoinPoint joinPoint, MyAnnotation requireXX) {
        // 获取aaHeader头的值,这里假设通过ServletRequest获取
        String aaHeaderValue = HttpServletRequestUtil.getAAHeaderValue();
        // 将aaHeaderValue存放到ThreadLocal中
        ThreadLocalUtil.setAAHeaderValue(aaHeaderValue);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中使用ThreadLocal存放请求的header信息可以通过以下步骤来实现: 1. 创建一个自定义的拦截器(Interceptor),用于在每个请求进入控制器方法之前进行拦截和处理。 2. 在拦截器中,使用ThreadLocal类来存储请求的header信息。ThreadLocal是一个线程局部变量,它可以确保每个线程都有自己独立的副本。这样就可以确保在处理请求的同时,不会出现线程安全问题。 下面是一个简单的示例代码: ```java public class HeaderInterceptor extends HandlerInterceptorAdapter { private static final ThreadLocal<Map<String, String>> headerThreadLocal = new ThreadLocal<>(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Map<String, String> headers = new HashMap<>(); // 将请求的header信息存储到ThreadLocal中 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); String headerValue = request.getHeader(headerName); headers.put(headerName, headerValue); } headerThreadLocal.set(headers); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 请求处理完成后,清除ThreadLocal中的数据,避免内存泄漏 headerThreadLocal.remove(); } public static Map<String, String> getHeaders() { return headerThreadLocal.get(); } } ``` 3. 在Spring Boot的配置类中注册拦截器: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HeaderInterceptor()); } } ``` 4. 在控制器中可以通过调用HeaderInterceptor的getHeaders方法来获取当前请求的header信息: ```java @RestController public class MyController { @GetMapping("/myEndpoint") public String myEndpoint() { Map<String, String> headers = HeaderInterceptor.getHeaders(); // 使用获取到的header信息进行处理 // ... return "Response"; } } ``` 这样,你就可以在Spring Boot中使用ThreadLocal存放请求的header信息了。每个请求都会有自己独立的header信息,不会相互干扰。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值