2016-07-27 19 views
3

Webサービスのメッセージ処理にSpring統合を使用します。残念ながら、メッセージには送信者のIPアドレスは含まれていません。この情報はどのように入手できますか?春の統合で送信者の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; 
} 
+0

[このスレッド]で可能な重複(http://stackoverflow.com/questions/10363069/how-can-i-retrieve-ip-address-from-http-header-in-java) –

答えて

3

SimpleWebServiceInboundGatewayは、デフォルトでは、トランスポートヘッダをマッピングしません。 DefaultSoapHeaderMapperを参照してください。もちろん あなた自身を実装することができますが、それは本当にあなたが使用するための十分かもしれません:

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

ターゲット@ServiceActivatorことに。

サービスアクティベータの前に別のスレッドにメッセージを移動しない場合は、もちろん動作します。 RequestContextHolder.currentRequestAttributes()ThreadLocalと関連付けられています。

0

あなたは、ヘッダーの値を取得するには、ユーザーのIPアドレスとのgetHeader()へのアクセスを得るためにgetRemoteAddr()を使用して、HttpServletRequestのからそれを取り出すことができます。これはあなたのコントローラクラスを変更できると仮定しています。

おそらくこれは役立ちます:

@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); 
    } 
} 
関連する問題