在微服务框架,内部模块间的通讯走的是zookpeer注册服务,在集成用户认证信息时遇到zk内部协议请求未携带认证token信息导致web请求未认证授权。这里解决方案是配置启动类,在类上使用@Configuration。把web请求的认证信息token在调用zk服务前注入进去。把启动类放入commom公共部分,每个模块引入common依赖,这样实现了在内部通信时携带的认证信息.实例代码如下:
/**
* Feign获取请求参数.*/
@Configuration
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
String token = getHeaders(getHttpServletRequest()).get("token");
if (StringUtils.isBlank(token)) {
token = getHttpServletRequest().getParameter("Token");
}
requestTemplate.header("Token", token);
}
private HttpServletRequest getHttpServletRequest() {
try {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
} catch (Exception e) {
return null;
}
}
private Map<String, String> getHeaders(HttpServletRequest request) {
Map<String, String> map = new LinkedHashMap<String, String>();
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
return map;
}
@Bean
public feign.Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}