1.问题描述
rabbitmq发送了一个消息之后,在消费者端获取RequestContextHolder.getRequestAttributes()为null,导致在消费者端发送feign时,配置的拦截器获取RequestContextHolder.getRequestAttributes()也为null,从而设置不了header.
2.解决方案
rabbitmq的生产者发送消息时添加请求头:
MessagePostProcessor messagePostProcessor = message -> {
message.getMessageProperties().setHeader("Authorization", request.getHeader("Authorization"));
return message;
};
rabbitTemplate.convertAndSend(RabbitMqConstant.EXCHANGE_NAME_EXPORT, ExportConstant.Otype.MEMBER.getValue(), jsonObject, messagePostProcessor);
创建一个属性类,实现RequestAttributes类:
package com.hecr;
import org.springframework.web.context.request.RequestAttributes;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class NonWebRequestAttributes implements RequestAttributes {
private Map<String, Object> map = new ConcurrentHashMap();
@Override
public Object getAttribute(String s, int i) {
return map.get(s);
}
@Override
public void setAttribute(String s, Object o, int i) {
map.put(s, o);
}
@Override
public void removeAttribute(String s, int i) {
map.remove(s);
}
@Override
public String[] getAttributeNames(int i) {
return new String[0];
}
@Override
public void registerDestructionCallback(String s, Runnable runnable, int i) {
}
@Override
public Object resolveReference(String s) {
return null;
}
@Override
public String getSessionId() {
return null;
}
@Override
public Object getSessionMutex() {
return null;
}
}
在rabbitmq的消费者端添加环境属性:
public void test(JSONObject jsonObject, Message message, Channel channel) throws IOException {
MessageProperties messageProperties = message.getMessageProperties();
String authorization = (String) messageProperties.getHeader("Authorization");
// 设置一个环境属性
NonWebRequestAttributes request = new NonWebRequestAttributes();
request.setAttribute("Authorization", authorization, 0);
RequestContextHolder.setRequestAttributes(request);
}
修改feign拦截器的代码:
package com.hecr.interceptor;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Configuration
public class FeignRequestInterceptor implements RequestInterceptor {
private final String AUTHORIZATION_HEADER = "Authorization";
private final String BEARER_TOKEN_TYPE = "Bearer";
@Override
public void apply(RequestTemplate requestTemplate) {
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
if (attributes != null) {
if (attributes instanceof ServletRequestAttributes) {
HttpServletRequest request = ((ServletRequestAttributes) attributes).getRequest();
String authorization = request.getParameter("Authorization");
requestTemplate.header(AUTHORIZATION_HEADER, authorization);
} else if (attributes instanceof NonWebRequestAttributes) {
String authorization = (String) attributes.getAttribute("Authorization", 0);
requestTemplate.header(AUTHORIZATION_HEADER, authorization);
}
}
}
}
3.效果
4.文章参考链接
a.https://blog.csdn.net/g3230863/article/details/108130725