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

新手上路,请多包涵

我正在编写一个 Java Rest Web 服务并且需要调用者的 IP 地址。我以为我曾经在 cookie 中看到过这个,但现在我看不到了。是否有一致的地方可以获取此信息?

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

原文由 Wanderer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 334
2 个回答

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

如果我没记错的话, request.getRemoteAddr() 左右。

原文由 kukudas 发布,翻译遵循 CC BY-SA 3.0 许可协议

像这样将 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();

}

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

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

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

原文由 rjdkolb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题