當我們做購物車時,出現一個需求,用戶->網關->頁面渲染服務->訂單查詢服務
網關給頁面渲染服務時帶着令牌(由網關直接寫入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