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; } }
下一篇:
进程同步,互斥锁与死锁的解决方法