当前位置: 首页 > 后端技术 > Java

自定义Feign拦截器实现设置请求头

时间:2023-04-01 18:23:06 Java

自定义Feign拦截器解决微服务间Feign调用请求头丢失问题在微服务开发过程中为了安全,使用了SpringSecurityOAuth2.0token认证,服务间调用时,使用Feign客户端,如果没有使用Feign拦截器添加请求头信息。下游服务无法收到经过身份验证的令牌,无法进行身份验证。定义Feign拦截器并实现RequestInterceptor接口@Slf4jpublicclassFeignRequestInterceptorimplementsRequestInterceptor{/***微服务间传递的唯一ID*/publicstaticfinalStringX_REQUEST_ID="X-Request-Id";@Overridepublicvoidapply(RequestTemplatetemplate){HttpServletRequesthttpServletRequest=getHttpServletRequest();if(httpServletRequest!=null){//获取头部信息Mapheaders=getHeaders(httpServletRequest);//传递所有请求头以防止部分丢失Iterator>iterator=headers.entrySet().iterator();//将请求的头部信息放入RequestTemplate的头部信息中,当使用RequestTemplate发起请求时,会自动添加头部信息while(iterator.hasNext()){Map.Entryentry=迭代器.next();template.header(entry.getKey(),entry.getValue());}//微服务之间传递的区分Case的唯一标识就是这样通过httpServletRequest得到的if(httpServletRequest.getHeader(X_REQUEST_ID)==null){Stringsid=String.valueOf(UUID.randomUUID());template.header(X_REQUEST_ID,sid);}log.debug("FeignRequestInterceptor:{}",template.toString());}}/***RequestContextHolder中获取HttpServletRequest对象**@return*/privateHttpServletRequestgetHttpServletRequest(){try{return((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();}catch(Exceptione){返回空值;}}/***获取头信息**@paramrequest*@return*/privateMapgetHeaders(HttpServletRequestrequest){Mapmap=newLinkedHashMap<>();Enumerationenumeration=request.getHeaderNames();if(enumeration!=null){while(enumeration.hasMoreElements()){Stringkey=enumeration.nextElement();字符串值=request.getHeader(key);map.put(键,值);}}returnmap;}}配置Bean@Bean@CocontinualOnMissingBean(FeignRequestInterceptor.class)publicRequestInterceptorfeignRequestInterceptor(){FeignRequestInterceptor拦截器=newFeignRequestInterceptor();log.info("FeignRequestInterceptor[{}]",拦截器);设备的doFilter方法进行token校验,通过tokenExtract的extract方法提取请求中携带的token信息