远程调用(feignClient、restTemplate)设置header头信息

╰半橙微兮° 2021-11-11 19:28 1144阅读 0赞

现在基本上所有的接口都需要权限验证(token、session等),所以在远程调用时,也需要把相应的参数传递过去。

一、feignClient + jwt-token

增加拦截配置:

  1. import org.apache.commons.lang.StringUtils;
  2. import feign.RequestInterceptor;
  3. import feign.RequestTemplate;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.web.context.request.RequestContextHolder;
  7. import org.springframework.web.context.request.ServletRequestAttributes;
  8. import lombok.extern.slf4j.Slf4j;
  9. import javax.servlet.http.HttpServletRequest;
  10. /**
  11. * @author gourd
  12. */
  13. @Configuration
  14. @Slf4j
  15. public class FeignConfig implements RequestInterceptor {
  16. @Value("${jwt.header}")
  17. private String tokenHeader;
  18. @Override
  19. public void apply(RequestTemplate requestTemplate) {
  20. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  21. if (attributes != null) {
  22. HttpServletRequest request = attributes.getRequest();
  23. String jwtToken = request.getHeader(tokenHeader);
  24. log.info("jwtToken:" + jwtToken);
  25. if (StringUtils.isNotBlank(jwtToken)) {
  26. // header里面添加jwt-token
  27. requestTemplate.header(tokenHeader, jwtToken);
  28. log.info("header:" + requestTemplate.headers());
  29. }
  30. }
  31. }
  32. }

调用方法:

  1. import com.gourd.common.data.BaseResponse;
  2. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PostMapping;
  7. /**
  8. * @author gourd
  9. */
  10. @FeignClient(name = "gourd-service",fallback = RemoteHystrix.class)
  11. @Component
  12. public interface RemoteClient {
  13. /**
  14. * FeignClient测试Get请求
  15. *
  16. * @return
  17. */
  18. @GetMapping("gourd/gourd/testG")
  19. @HystrixCommand
  20. BaseResponse testServerG();
  21. /**
  22. * FeignClient测试Post接口
  23. *
  24. * @return
  25. */
  26. @PostMapping("gourd/gourd/testP")
  27. @HystrixCommand
  28. BaseResponse testServerP();
  29. }
  30. import com.gourd.common.data.BaseResponse;
  31. import org.springframework.stereotype.Component;
  32. /**
  33. * @author gourd
  34. */
  35. @Component
  36. public class RemoteHystrix implements RemoteClient {
  37. @Override
  38. public BaseResponse testServerG() {
  39. return BaseResponse.failure("FeignClient测试Get请求失败,请稍后再试");
  40. }
  41. @Override
  42. public BaseResponse testServerP() {
  43. return BaseResponse.failure("FeignClient测试Post请求失败,请稍后再试");
  44. }
  45. }

二、restTemplate + jwt-token:

首先配置拦截器:

  1. import com.gourd.common.utils.RequestHolder;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.apache.commons.lang.StringUtils;
  4. import org.springframework.http.HttpHeaders;
  5. import org.springframework.http.HttpRequest;
  6. import org.springframework.http.MediaType;
  7. import org.springframework.http.client.ClientHttpRequestExecution;
  8. import org.springframework.http.client.ClientHttpRequestInterceptor;
  9. import org.springframework.http.client.ClientHttpResponse;
  10. import org.springframework.stereotype.Component;
  11. import javax.servlet.http.HttpServletRequest;
  12. import java.io.IOException;
  13. import java.nio.charset.StandardCharsets;
  14. /**
  15. * 设置HTTP请求 Header
  16. * @author gourd
  17. */
  18. @Component
  19. @Slf4j
  20. public class ActionTrackInterceptor implements ClientHttpRequestInterceptor {
  21. private static final String JWT_TOKEN_KEY = "jwt-token";
  22. @Override
  23. public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
  24. throws IOException {
  25. HttpServletRequest httpServletRequest = RequestHolder.getRequest();
  26. String jwtToken = httpServletRequest.getHeader(JWT_TOKEN_KEY);
  27. HttpHeaders headers = request.getHeaders();
  28. // 加入自定义字段
  29. log.info("jwtToken:" + jwtToken);
  30. if (StringUtils.isNotBlank(jwtToken)) {
  31. //header里面添加jwt-token
  32. headers.add(JWT_TOKEN_KEY, jwtToken);
  33. headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
  34. headers.set(HttpHeaders.ACCEPT_CHARSET, StandardCharsets.UTF_8.toString());
  35. }
  36. // 保证请求继续被执行
  37. return execution.execute(request, body);
  38. }
  39. }

注册一个 restTemplate:

  1. import com.gourd.common.handler.ActionTrackInterceptor;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.web.client.RestTemplate;
  7. import java.util.Collections;
  8. /**
  9. * @author gourd
  10. */
  11. @Configuration
  12. public class ClientConfig {
  13. @Autowired
  14. ActionTrackInterceptor actionTrackInterceptor;
  15. /**
  16. * 这里就是创建一个负载均衡的RestTemplate Bean
  17. *
  18. * @return
  19. */
  20. @LoadBalanced
  21. @Bean
  22. public RestTemplate restTemplate() {
  23. RestTemplate restTemplate = new RestTemplate();
  24. // 把自定义的ClientHttpRequestInterceptor添加到RestTemplate,可添加多个
  25. restTemplate.setInterceptors(Collections.singletonList(actionTrackInterceptor));
  26. return restTemplate;
  27. }
  28. }

调用方法:

  1. @Value("${spring.application.name:gourd-service}")
  2. private String applicationName;
  3. @Value("${server.servlet.context-path:gourd}")
  4. private String contextPath;
  5. @Value("${jwt.header}")
  6. private String tokenHeader;
  7. @Autowired
  8. private RestTemplate restTemplate;
  9. @GetMapping("/test")
  10. @ApiOperation("nacos测试接口")
  11. @HystrixCommand
  12. public BaseResponse testServerG() {
  13. BaseResponse response = restTemplate.getForObject( "http://"+applicationName+"/"+contextPath+"/gourd/nacos/testG", BaseResponse.class);
  14. log.warn("返回结果:{}",response);
  15. return response;
  16. }
  17. @PostMapping("/test")
  18. @ApiOperation("nacos测试接口")
  19. @ApiImplicitParams({@ApiImplicitParam(name = "jwt-token", value = "jwt-token", required = true, dataType = "string", paramType = "header")})
  20. @HystrixCommand
  21. public BaseResponse testServerP() {
  22. MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
  23. map.add("id","haha");
  24. HttpHeaders header = new HttpHeaders();
  25. HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map, header);
  26. BaseResponse response = restTemplate.postForObject("http://"+applicationName+"/"+contextPath+"/gourd/nacos/testP",httpEntity, BaseResponse.class);
  27. log.warn("返回结果:{}",response);
  28. return response;
  29. }

发表评论

表情:
评论列表 (有 0 条评论,1144人围观)

还没有评论,来说两句吧...

相关阅读

    相关 axios设置header请求信息

    > 在前端向后端发起请求时,经常需要设置一些请求头信息,例如验证用户是否登录的token信息,在使用axios发请求时,该如何设置请求头信息呢,下面演示下。 axio