如何在spring集成中获取发件人IP地址?

时间:2016-07-27 14:45:18

标签: java spring spring-integration

我使用Spring集成进行Web服务消息处理。不幸的是,邮件不包含发件人IP地址。我怎样才能获得这些信息?

@Bean
public SimpleWebServiceInboundGateway myInboundGateway() {
    SimpleWebServiceInboundGateway simpleWebServiceInboundGateway = new SimpleWebServiceInboundGateway();
    simpleWebServiceInboundGateway.setRequestChannelName("testChannel");
    simpleWebServiceInboundGateway.setReplyChannelName("testResponseChannel");
    return simpleWebServiceInboundGateway;
}

@ServiceActivator(inputChannel = "testChannel", outputChannel = "testResponseChannel")
public Message getHeaders(Message message) {
    // how can I reach the sender IP address here
    return message;
}

2 个答案:

答案 0 :(得分:3)

默认情况下,SimpleWebServiceInboundGateway不会映射传输标头。 见DefaultSoapHeaderMapper。 当然你可以实现自己的,但这可能足以让你使用:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
              .getRequest()
              .getRemoteAddr();

表示您的目标@ServiceActivator

当然,如果您不在服务激活器之前将消息转移到其他线程,那么这将起作用。 RequestContextHolder.currentRequestAttributes()ThreadLocal绑定。

答案 1 :(得分:0)

您可以从HttpServletRequest中检索它,使用getRemoteAddr()访问用户IP地址,使用getHeader()获取标头值。这假设您可以修改控制器类。

也许这会有所帮助:

@Controller
public class MyController {
    @RequestMapping(value="/do-something")
    public void doSomething(HttpServletRequest request) {
        final String userIpAddress = request.getRemoteAddr();
        final String userAgent = request.getHeader("user-agent");
        System.out.println (userIpAddress);
    }
}