目录
一、远程调用请求头丢失的问题(丢失之后明明登录了却拿不到远程调用的远程数据)
一、远程调用请求头丢失的问题(丢失之后明明登录了却拿不到远程调用的远程数据)
定义一个远程调用的请求拦截器,把老请求的一些信息放入到新请求中
@Configuration
public class GuliFeignConfiguration {
@Bean
public RequestInterceptor requestInterceptor(){
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes requestAttributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest(); //获取老请求
String cookie = request.getHeader("Cookie");
// 设置到新请求中去
requestTemplate.header("Cookie",cookie);
}
};
}
}
扩展====直接获取cookie和通过请求头来获取cookie的区别
①直接获取得到的是地址,通过请求头来获取cookie是可读的;
②放在请求头的时候只能发送一次,而cookie每次发送请求都可以携带
@ResponseBody
@GetMapping("/zs")
public String zs( HttpServletRequest httpServletRequest){
System.out.println("======================");
String cookie = httpServletRequest.getHeader("Cookie");
System.out.println(cookie);
Cookie[] cookies = httpServletRequest.getCookies();
System.out.println(cookies);
System.out.println("======================");
return "zs";
}
二、异步调用(丢失请求头问题or说丢失上下文)
在异步之前通过RequestContextHolder获取请求属性
//在异步之前获取请求属性
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
逻辑代码
}, executorService);
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
逻辑代码
}, executorService);