【问题标题】:how to pass values through http headers dynamically using spring integration如何使用spring集成动态地通过http标头传递值
【发布时间】:2015-04-10 15:38:12
【问题描述】:

我正在开发一个 REST 应用程序,我的 REST 应用程序总是通过通过 http 标头传递一些参数来调用。我的 REST 应用程序中有一个过滤器,它会为每个请求调用并从 http 标头检索参数,如图所示下面。

 @Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpServletRequest=(HttpServletRequest) request;
    String email = httpServletRequest.getHeader("user-email");         
    String userName = httpServletRequest.getHeader("user-name"); 
    chain.doFilter(request, response);
}

我的rest应用程序使用spring集成依次调用soap服务。调用soap服务的代码如下。

@RequestMapping(value = "/projects", method = RequestMethod.GET, produces = "application/json")
public @ResponseBody List<Project> getProject(HttpServletRequest httpRequest) {
    GetAuthorizedWebSendTransferProjects request = new GetAuthorizedWebSendTransferProjects();
    GetAuthorizedWebSendTransferProjectsResponse response = gw.getResponse(request);
    JAXBElement<ArrayOfProjectContainer> arr = response.getGetAuthorizedWebSendTransferProjectsResult();
    ArrayOfProjectContainer arr1 = arr.getValue();
    List<ProjectContainer> arr2 = arr1.getProjectContainer();
    List<Project> projects = getPopulatedProjectList(arr2);
    return projects;
}

应用程序上下文.xml

<int:chain input-channel="requestChannel" output-channel="outputChannel">
    <int-ws:header-enricher>
        <int-ws:soap-action
            value="http://tempuri.org/IPermissionService/GetAuthorizedWebSendTransferProjects"/>
    </int-ws:header-enricher>
    <int-ws:outbound-gateway
        uri="http://10.255.2.51/PermissionService.svc?wsdl" marshaller="marshaller"
        unmarshaller="marshaller" interceptor="addHttpHeaderInterceptor"/>
</int:chain>

我还有一个拦截器,可以将参数添加到作为静态数据的 http 标头。

 @Override
public boolean handleRequest(MessageContext messageContext)
        throws WebServiceClientException {
    TransportContext context = TransportContextHolder.getTransportContext();
    HttpUrlConnection connection = (HttpUrlConnection) context.getConnection();
    HttpURLConnection connection1= connection.getConnection();
    connection1.addRequestProperty("user-email","ws_user1@biopacstest.domain");
    connection1.addRequestProperty("user-name","ws_user1");
    return true;
}

但我需要动态传递“用户电子邮件”和“用户名”而不是静态传递,即我在过滤器中收到的数据。任何人都可以帮助我解决这个问题。提前致谢。

【问题讨论】:

    标签: java rest soap spring-boot spring-integration


    【解决方案1】:

    解决方案是在拦截器中使用ThreadLocal,然后在调用网关之前设置标头。

    private final ThreadLocal<MyHolder> holder = new ThreadLocal<MyHolder>();
    
    @Override 
    public boolean handleRequest(MessageContext messageContext)
            throws WebServiceClientException {
        TransportContext context = TransportContextHolder.getTransportContext();
        HttpUrlConnection connection = (HttpUrlConnection) context.getConnection();
        HttpURLConnection connection1= connection.getConnection();
        MyHolder holder = this.holder.remove();
        connection1.addRequestProperty("user-email", holder.getEmail());
        connection1.addRequestProperty("user-name", holder.getUser());
        return true;
    }
    
    
    public Message<?> setUserInfo(Message<?> message, String user, String email) {
        this.holder.set(new MyHolder(user, email));
        return message;
    }
    

    然后,在您的集成流程中,添加到 chain...

    <int:service-activator expression=@interceptorBean.setUserInfo(#root, headers['user'], headers['email'])" />
    

    (其中 MyHolder 是一个简单的 java bean)。表达式可以是你想要的任何东西(不仅仅是标题访问)。或者,只需传入Message&lt;?&gt; 并在代码内部确定用户/电子邮件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      相关资源
      最近更新 更多