feign调用时使用RequestInterceptor设置re
2020-05-08 本文已影响0人
小胖学编程
在SpringCloud微服务中,可以使用feign组件来完成服务调用。但是有时需要设置request对象。那么需要实现RequestInterceptor
接口来完成我们的需求。
对应接口:
//可以配置零个或多个RequestInterceptor,以便可以为所有请求添加请求头。对于拦截器调用的顺序,没有给出任何的保证。
public interface RequestInterceptor {
/**
* Called for every request. Add data using methods on the supplied {@link RequestTemplate}.
*/
void apply(RequestTemplate template);
}
自定义实现:
@Configuration
public class FeignConfig implements RequestInterceptor {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void apply(RequestTemplate requestTemplate) {
//获取到进入时的request对象
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (null != attributes) {
HttpServletRequest request = attributes.getRequest();
//获取到请求头名字
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
//获取到请求头
String value = request.getHeader(name);
//经过处理逻辑后
//使用进入的request对象来设置Feign请求对象的请求头
requestTemplate.header(name, value);
}
//获取进入线程的Cookie信息(获取token信息)
String token = CookieUtil.getCookie(request, "token");
//设置Cookie字段
requestTemplate.header("Cookie", "token=" + token);
}
}
工具类:
public class CookieUtil {
private static Logger logger= LoggerFactory.getLogger(CookieUtil.class);
public static void writeCookie(HttpServletResponse response, String cookieName, String value, int maxAge, String domain) {
Cookie cookie = new Cookie(cookieName, value);
cookie.setPath("/");
if(StringUtils.isNotBlank(domain)) {
cookie.setDomain(domain);
}
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
public static String getCookie(HttpServletRequest request, String cookieName) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
return cookie.getValue();
}
}
}
return null;
}
}
当然,FeignConfig
也可以无须定义在Spring容器中。在@Feign注解上直接使用也可以生效。
@FeignClient(value = "wechat", configuration = FeignConfig.class)