当我们做购物车时,出现一个需求,用户->网关->页面渲染服务->订单查询服务
网关给页面渲染服务时带着令牌(由网关直接写入request的header)
页面渲染服务需要调用订单查询服务里的查询购物车,通过feign的形式去调用,但是由于订单查询受oauth2保护,feign无法直接传递令牌,令牌到页面渲染后无法传递给订单查询
此时可以用feign的拦截器,拦截器应该定义在公共模块中,因为很多微服务都会使用这个拦截器
代码如下
package com.changgou.interceptor; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestAttribute; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Enumeration; @Component public class FeignInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { //传递令牌 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); if(requestAttributes != null){ HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); if(request != null){ Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String headerName = headerNames.nextElement(); if("authorization".equals(headerName)){ String headerValues = request.getHeader(headerName);//得到的内容为 Bearer jwt令牌 //传递令牌 requestTemplate.header(headerName,headerValues); } } } } } }
使用这个拦截器,需要我们在拥有令牌的请求发起者处以bean的形式注入,比如这里就是在页面渲染服务中调用
此处我们在引导类中注入
@SpringBootApplication @EnableEurekaClient @EnableFeignClients(basePackages = "com.changgou.order.feign") public class WebOrderApplication { public static void main(String[] args) { SpringApplication.run(WebOrderApplication.class,args); } //feign拦截器,用于拦截feign,在微服务间转发令牌 @Bean public FeignInterceptor feignInterceptor(){ return new FeignInterceptor(); } }
1
1