Feign服务之间的鉴权问题
Feign服务调服务传递数据的时候,需要带token验证的,而调用那个用户服务的时候被用户服务方拦截然后没有token进不去接口,很明显的是因为没有token导致,那么Feign里面有提供一个接口叫做RequestInterceptor,只要实现这个接口,简单做一些处理,比如说我们验证请求头的token叫Access-Token,我们就先取出当前请求的token,然后放到feign请求头上,再去请求接口。
解决方案: 直接上代码
public class AuthRequestInterceptor implements RequestInterceptor {
private static final Logger log = LoggerFactory.getLogger(AuthRequestInterceptor.class);
@Override
public void apply(RequestTemplate requestTemplate) {
try {
Map<String, String> headers = getHeaders();
List<String> cookies = getCookie();
if (null != cookies && cookies.size() > 0) {
log.info("cookie: {}", cookies);
requestTemplate.header("Cookie", cookies.stream().collect(Collectors.joining(";")));
}
for (String headerName : headers.keySet()) {
requestTemplate.header(headerName, headers.get(headerName));
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Map<String, String> getHeaders() {
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
Map<String, String> map = new LinkedHashMap<>();
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
return map;
}
private List<String> getCookie() {
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
List<String> cookies = new ArrayList<>();
if(null == request || null == request.getCookies()){
return null;
}
for (Cookie it : request.getCookies()) {
if ("mips_token".equals(it.getName())) {
cookies.add("token=" + it.getValue());
}
}
return cookies;
}
}
下一篇:
进程同步,互斥锁与死锁的解决方法
