休息 - 如何获取呼叫者的IP地址

我正在编写 Java Rest Web 服务,需要调用方的 IP 地址。我以为我曾经在饼干中看到过这个,但现在我没有看到它。是否有一致的位置来获取此信息?

我看到一个使用“OperationalContext”来获取它的例子,但那不是在java中。


答案 1

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();

}

正如 Nagpal @Hemant中提到的,如果负载均衡器将其插入到请求中,您还可以检查 X-Forwarded-For 标头以确定真正的源。根据这个答案getHeader() 调用不区分大小写。

您还可以获取客户端联系的服务器名称。这是 DNS 名称或主机标头中设置的值,OSI 第 7 层负载均衡器可以填充。

1. 示例:不填充标头

curl "http://127.0.0.1:8080/"

返回

IP is 127.0.0.1
Host is 127.0.0.1

2. 示例:填充 X 转发 For 和主机标头

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

答案 2

我认为您可以通过请求对象获取IP。

如果我没有记错的话,或者说。request.getRemoteAddr()