Feign服务调服务传递数据带token验证
Feign服务调服务就不多做介绍了,值得提醒的是,Feign服务调服务传递数据的时候,比如某用户服务是需要带token验证的,而调用那个用户服务的时候报错,提示token为空,是因为Feign请求的时候没有带上token
解决方式
要解决这个问题,想必能猜到最方便的就是往请求头里加上token,一起带过去
Feign有提供一个本文来源gaodai#ma#com搞*!代#%^码$网*接口,RequestInterceptor
只要实现这个接口,简单做一些处理,比如说我们验证请求头的token叫Access-Token,我们就先取出当前请求的token,然后放到feign请求头上
import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /** * Feign配置 * 使用FeignClient进行服务间调用,传递headers信息 */ @Configuration public class FeignConfig implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //添加token requestTemplate.header("Access-Token", request.getHeader("Access-Token")); } }
这样已经成功往Feign请求头里加上了Token,还可以这样,为了方便本地调试,可以在Spring Boot加上过滤器,每次本地调用没有Token的时候加上一个,只要实现Spring提供的Filter接口
import org.apache.commons.lang3.StringUtils; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.IOException; /** * 每次请求过滤器拦截加Token */ public class AddTokenFilter implements Filter { /** * superAdmin */ private static final String DEFAULT_TOKEN = "你的token"; private String profilesActive; public AddTokenFilter(String profilesActive) { super(); this.profilesActive = profilesActive; } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //判断是开发模式(dev)还是生产坏境(pro) //如果不是开发坏境,不做任何操作,是开发坏境,往本地测试的request加请求头 if (profilesActive == null || !EnumEnvType.DEV.toString().equalsIgnoreCase(profilesActive)) { filterChain.doFilter(servletRequest, servletResponse); return; } filterChain.doFilter(new CustomeizedRequest((HttpServletRequest) servletRequest), servletResponse); } @Override public void destroy() { } //继承HttpServletRequestWrapper ,重写getHeader获取请求头的值 private class CustomeizedRequest extends HttpServletRequestWrapper { /** * Constructs a request object wrapping the given request. * * @param request * @throws IllegalArgumentException if the request is null */ public CustomeizedRequest(HttpServletRequest request) { super(request); } @Override public String getHeader(String name) { if (!Constant.HTTP_HEADER_ACCESS_TOKEN.equalsIgnoreCase(name)) { return super.getHeader(name); } String token = super.getHeader(name); return StringUtils.isNotBlank(token) ? token : DEFAULT_TOKEN; } } }