Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取SOAP请求客户机的源IP?_Java_Web Services - Fatal编程技术网

Java 如何获取SOAP请求客户机的源IP?

Java 如何获取SOAP请求客户机的源IP?,java,web-services,Java,Web Services,如何获取源ip、用户名、密码等。。。发送soap请求的客户端计算机的名称?是否有任何这些细节可以用于日志记录 我正在使用Java来处理传入的SOAP请求。这项服务只是增加了2个数字,并且正在工作,但我只需要获得一些客户的详细信息 谢谢,拉瓦尼亚我不确定我是否完全理解您获取客户机用户名和密码的想法。 通常,通过Soap查看Soap头,它们应该携带身份验证信息(可能是用户名、密码或某种安全性)。 对于IP,您的Soap是通过Http发送的,因此当您收到请求时,您可以尝试查看Http头,以查看它提供了

如何获取源ip、用户名、密码等。。。发送soap请求的客户端计算机的名称?是否有任何这些细节可以用于日志记录

我正在使用Java来处理传入的SOAP请求。这项服务只是增加了2个数字,并且正在工作,但我只需要获得一些客户的详细信息


谢谢,拉瓦尼亚

我不确定我是否完全理解您获取客户机用户名和密码的想法。 通常,通过Soap查看Soap头,它们应该携带身份验证信息(可能是用户名、密码或某种安全性)。
对于IP,您的Soap是通过Http发送的,因此当您收到请求时,您可以尝试查看Http头,以查看它提供了什么信息。虽然我从未尝试从中获取客户机的IP,但它可能在HTTP头中,即您使用的soap堆栈中。如果您使用axis将其部署为war文件,那么很容易做到这一点。您需要获得httprequestobject并对其调用HTTPServletRequest.getRemoteAddr()方法。

如果您使用的是JAX-WS,请插入WebServiceContext,如下所示:

import javax.annotation.Resource
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;


@WebService()
public class Test
{
  @Resource WebServiceContext context;

  @WebMethod(operationName = "getInfo")
  public String getInfo()
  {
    HttpServletRequest request = (HttpServletRequest)context.getMessageContext().get(MessageContext.SERVLET_REQUEST);
    return "IP: "+request.getRemoteAddr()+", Port: "+request.getRemotePort()+", Host: "+request.getRemoteHost();
  }
}
将返回如下内容:

IP:127.0.0.1,端口:2636,主机:localhost


其余的方法请参阅。基本上,一旦有了
HttpServletRequest
对象,剩下的就很简单了。

我已经想出了如下解决方案-

@Endpoint 
public class DataEndpoints {
....
....
     private HttpServletRequest httpServletRequest;

     @Autowired
     public void setRequest(HttpServletRequest request) {
         this.httpServletRequest = request;
     }


     @PayloadRoot(namespace = employeeNS, localPart = "syncRelation")
     @ResponsePayload
     public SyncRelationResponse dataSync(@RequestPayload SyncOrderRelation request) {
            String incoming = "IP Address -> " + this.httpServletRequest.getRemoteAddr();
     }
}
通过使用以下方法,我可以直接访问HttpServletRequest。然后我可以访问我需要的所有数据


我希望它能在这方面帮助一些人。

该服务是以.jar文件运行的。然后我使用我的WSDL文件来创建和启动请求。看起来我必须尝试使用HTTP头对象。标题中是否有默认传递的元数据,或者严格来说是您放入标题中的元数据?这个答案应该被接受。我使用了这种方法,效果非常好!我正在使用以下方法,但我发现它不能正常工作。你有提到的类的用法的例子吗。“这将非常有帮助。”Saikat1529鉴于这个答案已经有7年多的历史了,我建议你问一个新的问题question@Catchwa谢谢你的回复。但我已经想出了解决办法。