zoukankan      html  css  js  c++  java
  • 记录一次SpringCloud Fegin远程调用出现的问题

    问题描述

    在公司一次接口调用的时候,由于所有的接口都需要在请求头上设置token来验证身份,所以我从本服务调用远程服务的时候使用了feign来调用,但是出现了一个很致命的问题,由于我用了线程池,导致request被销毁,在子线程中无法访问主线程的request(其实就算能访问到也被销毁了),所以调用的时候显示未登录。


    同时我也使用拦截器做了处理,但是由于request已经不是主线程那个request,所以在用线程池异步调用远程接口时,根本无法使用。

    @Configuration
    public class FeignConfiguration implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            HttpServletRequest request = SpringContextUtils.getHttpServletRequest();
            Enumeration<String> headerNames = request.getHeaderNames();
            if (headerNames != null) {
                while (headerNames.hasMoreElements()) {
                    String name = headerNames.nextElement();
                    String values = request.getHeader(name);
                    requestTemplate.header(name, values);
                }
            }
        }
    }
    

    解决思路

    首先由于request已经被销毁,那么我就只能先把我所需要的token保存下来,将token传入进来之后,事情就好办了许多,我们在fegin调用的时候,会使用feginClient将接口暴露到我们的代码里,这时候只需要在方法的参数前面上使用@RequestHeader就可以将我们所需要的token设置到header里

    @FeignClient(name = "test", url = "${test-url}")
    @Component
    public interface TestFegin {
    	@PostMapping(value = "/auth/oauth/token")
    	JSONObject getList(@RequestHeader("token") String token,
    	                    @RequestParam("username") String username,
    	                    @RequestParam("password") String password);
    }
    
    

    这里感谢两篇博客提供的解决思路

    Spring Cloud Feign 请求时附带请求头

    已解决)如何在调用fegin接口时设置请求头header和传入参数

  • 相关阅读:
    .Net控件创建热键
    .Net字符串处理
    C++ 中通过函数名字的字符串调用函数
    将.Net应用程序依赖的库文件部署到其他目录下
    VS2012生成事件
    visual studio导出项目模板
    .Net Program Unable to copy a file from objDebug to binDebug
    VBA引用.Net类库
    .Net 自定义事件
    VB.Net 解决winForm界面卡死
  • 原文地址:https://www.cnblogs.com/haijie-wrangler/p/15113106.html
Copyright © 2011-2022 走看看