springcloud- FeginClient 調用統一攔截添加請求頭 RequestInterceptor ,被調用服務獲取請求頭

使用場景:html

  在springcloud中經過Fegin調用遠端RestApi的時候,常常須要傳遞一些參數信息到被調用服務中去,好比從A服務調用B服務的時候,
  須要將當前用戶信息傳遞到B調用的服務中去,咱們就能夠使用實現 RequestInterceptor接口,完成FeginClient 請求調用時攔截請求的統一處理請求頭,添加請求頭信息等;spring

@Slf4j @Component public class DtsInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { //TODO 作一些業務處理,獲取數據,添加數據到請求頭
 requestTemplate.header(key,value); } }

 在被調用服務中獲取請求頭app

 第一種方式:ide

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); try { request.setCharacterEncoding(「UTF-8」); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } String sUserInfo = request.getHeader(KEY);

第二種方式:post

 配置Spring MVC的攔截器(Interceptor),能夠自定義實現HandlerInterceptor接口,也能夠經過繼承HandlerInterceptorAdapter類,後者是前者的實現類。spa

 

public class UserInterceptor extends HandlerInterceptorAdapter { /** 預處理回調方法,實現處理器的預處理(如登陸檢查)。 * 第三個參數爲響應的處理器,即controller。 * 返回true,表示繼續流程,調用下一個攔截器或者處理器。 * 返回false,表示流程中斷,經過response產生響應。 * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String key = request.getHeader("key"); if(StringUtils.isNotBlank(key)){ return false ; }else { //TODO 解析key爲用戶信息,解析成功返回true,解析失敗返回false
            return true ; } } /** *當前請求進行處理以後,也就是Controller 方法調用以後執行, *可是它會在DispatcherServlet 進行視圖返回渲染以前被調用。 *此時咱們能夠經過modelAndView對模型數據進行處理或對視圖進行處理。
*/ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { super.postHandle(request, response, handler, modelAndView); } /** *方法將在整個請求結束以後,也就是在DispatcherServlet 渲染了對應的視圖以後執行。 *這個方法的主要做用是用於進行資源清理工做的。 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { super.afterCompletion(request, response, handler, ex); }

 

爲了使自定義的攔截器生效,須要註冊攔截器到spring容器中,具體的作法是繼承 WebMvcConfigurerAdapter類,覆蓋其 addInterceptors(InterceptorRegistry registry)方法。最後別忘了把Bean註冊到Spring容器中,能夠選擇@Component 或者 @Configuration。

 

@Component public class InterceptorConfiguration extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { // 註冊攔截器
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new UserInterceptor()); // 配置攔截的路徑
        interceptorRegistration.addPathPatterns("/**"); // 配置不攔截的路徑
        interceptorRegistration.excludePathPatterns("/**.html"); // 還能夠在這裏註冊其它的攔截器 // registry.addInterceptor(new OtherInterceptor()).addPathPatterns("/**");
      super.addInterceptors(registry);
 } }
相關文章
相關標籤/搜索