<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      springboot~某個(gè)接口模擬登錄并同步給feign

      功能

      1. 某個(gè)rest接口是公開的,它的feign服務(wù)的接口需要授權(quán)
      2. 重寫一個(gè)HttpServletRequestWrapper,實(shí)現(xiàn)模擬登錄之后把header頭進(jìn)行填充
      3. 接口請(qǐng)求上下文里的token,通過Feign攔截器轉(zhuǎn)給每個(gè)feign請(qǐng)求上下文
      4. 完成對(duì)feign接口的自動(dòng)授權(quán)訪問 

      重寫HttpServletRequestWrapper

      /**
       * 自定義的請(qǐng)求上下文.
       */
      public class CustomHttpServletRequest extends HttpServletRequestWrapper {
      
          private Map<String, String> headers = new HashMap<>();
      
          public CustomHttpServletRequest(HttpServletRequest request) {
              super(request);
          }
      
          public void addHeader(String name, String value) {
              headers.put(name, value);
          }
      
          @Override
          public String getHeader(String name) {
              String value = super.getHeader(name);
      
              if (headers.containsKey(name)) {
                  value = headers.get(name);
              }
      
              return value;
          }
      
          @Override
          public Enumeration<String> getHeaderNames() {
              List<String> names = Collections.list(super.getHeaderNames());
              names.addAll(headers.keySet());
      
              return Collections.enumeration(names);
          }
      
          @Override
          public Enumeration<String> getHeaders(String name) {
              List<String> list = Collections.list(super.getHeaders(name));
      
              if (headers.containsKey(name)) {
                  list.add(headers.get(name));
              }
      
              return Collections.enumeration(list);
          }
      }
      

      建立過濾器

      @Component
      public class CustomFilter implements Filter {
          @Autowired
          KcUserClient kcUserClient;
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              CustomHttpServletRequest request = new CustomHttpServletRequest((HttpServletRequest) servletRequest);
              request.addHeader("Authorization", "Bearer " + login().getAccessToken());
              filterChain.doFilter(request, servletResponse);
          }
      
          public KeycloakAccessToken login() {
              // 登陸參數(shù)省略
              var result = kcUserClient.login(authTokenRequest);
              return result;
          }
      }
      

      WebMvcConfigurer里注冊(cè)

      對(duì)/add接口進(jìn)行配置

      @Configuration
      public class WebMvcConfig implements WebMvcConfigurer {
      
          @Resource
          private CustomFilter customFilter;
      
          @Bean
          public FilterRegistrationBean<CustomFilter> initFilterRegistrationBean() {
              FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();
              registrationBean.setFilter(customFilter);
              registrationBean.addUrlPatterns("/add");
              registrationBean.setOrder(0);
              return registrationBean;
          }
      }
      

      Feign攔截器的配置

      /**
       * @description: Feign內(nèi)部調(diào)用時(shí)帶上請(qǐng)求頭信息
       * 注意:要去yml里面改變hystrix Feign的隔離策為strategy: SEMAPHORE
       **/
      @Configuration
      public class FeignConfiguration implements RequestInterceptor {
      
          @Override
          public void apply(RequestTemplate template) {
              ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                      .getRequestAttributes();
              HttpServletRequest request = attributes.getRequest();
              Enumeration<String> headerNames = request.getHeaderNames();
              if (headerNames != null) {
                  while (headerNames.hasMoreElements()) {
                      String name = headerNames.nextElement();
                      String values = request.getHeader(name);
                      template.header(name, values);
                  }
              }
              Enumeration<String> bodyNames = request.getParameterNames();
              StringBuffer body = new StringBuffer();
              if (bodyNames != null) {
                  while (bodyNames.hasMoreElements()) {
                      String name = bodyNames.nextElement();
                      String values = request.getParameter(name);
                      body.append(name).append("=").append(values).append("&");
                  }
              }
              if (body.length() != 0) {
                  body.deleteCharAt(body.length() - 1);
                  template.body(body.toString());
              }
          }
      }
      

      上面代碼完成了對(duì)/add接口的攔截,通過自動(dòng)授權(quán),完成對(duì)授權(quán)接口kcUserClient.addUser();調(diào)用。

      KcUserClient內(nèi)容

      @FeignClient(name = "keycloak", url = "http://192.168.4.26:8080/auth", configuration = KcUserClient.Configuration.class)
      public interface KcUserClient {
          @PostMapping("/admin/realms/demo/users")
          ResponseEntity<?> addUser(@RequestBody UserDTO userDTO);
      
          @RequestMapping(value = "/realms/demo/protocol/openid-connect/token",
                  method = RequestMethod.POST,
                  consumes = "application/x-www-form-urlencoded")
          KeycloakAccessToken login(@RequestBody AuthTokenRequest authTokenRequest);
      
          /**
           * 轉(zhuǎn)向器.
           */
          class Configuration {
              @Bean
              Encoder feignFormEncoder(ObjectFactory<HttpMessageConverters> converters) {
                  return new SpringFormEncoder(new SpringEncoder(converters));
              }
          }
      }
      
      posted @ 2021-02-25 11:01  張占嶺  閱讀(510)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲人成色99999在线观看| 人妻中文字幕精品一页| 亚洲第一极品精品无码久久| 国产三级a三级三级| 久久日韩精品一区二区五区| 国产一区二区不卡91| 久久综合色之久久综合色| 亚洲春色在线视频| 国产日韩精品视频无码| 亚洲熟妇色自偷自拍另类| 国产三级国产精品久久成人| 国产免费AV片在线看| 动漫av网站免费观看| 国产欧美日韩免费看AⅤ视频| free性开放小少妇| 青青国产揄拍视频| 柠檬福利第一导航在线| 久青草视频在线观看免费| 99久久婷婷国产综合精品青草漫画 | www免费视频com| 日日麻批免费40分钟无码| 精品 日韩 国产 欧美 视频| 国产福利永久在线视频无毒不卡| 久久er热在这里只有精品66| 26uuu另类亚洲欧美日本| 亚洲偷自拍国综合| 精品不卡一区二区三区| 欧美视频二区欧美影视| 日韩精品人妻系列无码av东京| 亚洲AV成人无码久久精品四虎| 无码va在线观看| 国产精品一区二区久久毛片| 国产精品久久国产精麻豆99网站| 色九月亚洲综合网| 激情影院内射美女| 国产天美传媒性色av| 日韩V欧美V中文在线| 国产午夜精品理论大片| 亚洲第一极品精品无码久久| 色综合久久久久综合体桃花网| 中文字幕国产精品综合|