Web Services Rest -如何获取呼叫方的IP地址

h79rfbju  于 2022-11-15  发布在  其他
关注(0)|答案(5)|浏览(230)

我正在编写一个Java Rest Web服务,需要调用者的IP地址。我以为我曾经在cookie中看到过这个地址,但现在看不到了。是否有一个一致的位置可以获取此信息?
我看到了一个使用“OperationalContext”来获取它的示例,但这不是Java中的。

qv7cva1a

qv7cva1a1#

HttpServletRequest注入Rest服务,如下所示:

import javax.servlet.http.HttpServletRequest;

@GET
@Path("/yourservice")
@Produces("text/xml")
public String activate(@Context HttpServletRequest req,@Context SecurityContext context){

   String ipAddressRequestCameFrom = requestContext.getRemoteAddr();
   // header name is case insensitive
   String xForwardedForIP = req.getHeader("X-Forwarded-For");

   // if xForwardedForIP is populated use it, else return ipAddressRequestCameFrom 
   String ip = xForwardedForIP != null ? xForwardedForIP : ipAddressRequestCameFrom;
   System.out.println("IP is "+ip);

   // get the host name the client contacted. If the header `Host` is populated the `Host` header is automatically returned.
   // An AWS ALB populated the Host header for you.
   String hostNameRequestCameFrom = req.getServerName();
   System.out.println("Host is "+hostNameRequestCameFrom);

   
   //Also if security is enabled
   Principal principal = context.getUserPrincipal();
   String userName = principal.getName();

}

正如@ HemantNagpal提到的,如果负载平衡器将X-Forwarded-For头插入到请求中,您还可以检查X-Forwarded-For头以确定真实的的源。
您也可以取得客户端连络的服务器名称。这是DNS名称或Host信头中设定的值,其中OSI第7层负载平衡器可以填入。

1.示例:未填充标题

curl "http://127.0.0.1:8080/"

返回

IP is 127.0.0.1
Host is 127.0.0.1

2.示例:X-Forwarded-填充For和Host标头

curl --header "X-Forwarded-For: 1.2.3.4" --header "Host: bla.bla.com:8443" "http://127.0.0.1:8080/"

返回

IP is 1.2.3.4
Host is bla.bla.com
4xrmg8kj

4xrmg8kj2#

我想你可以通过请求对象得到IP。
如果我没记错的话,request.getRemoteAddr()左右。

wyyhbhjk

wyyhbhjk3#

你可以这样做:

@WebService
public class YourService {

   @Resource
   WebServiceContext webServiceContext; 

   @WebMethod 
   public String myMethod() { 

      MessageContext messageContext = webServiceContext.getMessageContext();
      HttpServletRequest request = (HttpServletRequest) messageContext.get(MessageContext.SERVLET_REQUEST); 
      String callerIpAddress = request.getRemoteAddr();

      System.out.println("Caller IP = " + callerIpAddress); 

   }
}
lfapxunr

lfapxunr4#

假设您正在使用servlet创建“Web服务”,那么请求对象上相当简单的方法调用.getRemoteAddr()将为您提供调用者的IP地址。

rn0zuynd

rn0zuynd5#

  • 如果您的应用程序在位于反向代理或负载平衡器后面的Web服务器上运行,则该代理可以配置为将请求的IP地址插入到请求报头中。不同的反向代理可以插入不同的报头。请参考代理服务器的文档。我们在下面的示例中列出了几个最常用的反向代理,但这绝不是一个完整的列表。当您的客户端使用(forward)代理,则它可能会插入标头来说明客户端IP地址是什么。也可能不插入。并且在此处插入的IP地址可能不正确。这意味着您通过调用request.getRemoteAddr()是请求的直接上游源的IP地址。正如我们所说的,有许多头用于不同的代理,但是x-forwareed-for很可能是由代理插入的。最后一点要注意的是,即使您从header或request.getRemoteAddr()中获取IP地址,也不能保证它是客户端IP地址。例如:如果你的代理服务器没有包含客户端的IP地址,那么你会得到代理服务器或负载均衡器的IP地址。如果你的客户端在一个专用网络上工作,并通过NAT网关连接到互联网,那么HTTP请求中的IP地址将是NAT服务器的地址,甚至对于黑客来说,注入一个具有不同IP地址的报头也是相当容易的。因此,这意味着您无法可靠地找到发出请求的系统的IP地址。*
private static final String[] IP_HEADER_CANDIDATES = { 
        "X-Forwarded-For",
        "Proxy-Client-IP",
        "WL-Proxy-Client-IP",
        "HTTP_X_FORWARDED_FOR",
        "HTTP_X_FORWARDED",
        "HTTP_X_CLUSTER_CLIENT_IP",
        "HTTP_CLIENT_IP",
        "HTTP_FORWARDED_FOR",
        "HTTP_FORWARDED",
        "HTTP_VIA",
        "REMOTE_ADDR" };

    public static String getClientIpAddress(HttpServletRequest request) {
        for (String header : IP_HEADER_CANDIDATES) {
            String ip = request.getHeader(header);
            if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
                return ip;
            }
        }
        return request.getRemoteAddr();
    }

相关问题