我正在编写一个 Java Rest Web 服务并且需要调用者的 IP 地址。我以为我曾经在 cookie 中看到过这个,但现在我看不到了。是否有一致的地方可以获取此信息?
我看到一个使用“OperationalContext”来获取它的示例,但它不是在 java 中。
原文由 Wanderer 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在编写一个 Java Rest Web 服务并且需要调用者的 IP 地址。我以为我曾经在 cookie 中看到过这个,但现在我看不到了。是否有一致的地方可以获取此信息?
我看到一个使用“OperationalContext”来获取它的示例,但它不是在 java 中。
原文由 Wanderer 发布,翻译遵循 CC BY-SA 4.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 许可协议
15 回答8.1k 阅读
2 回答11.5k 阅读✓ 已解决
8 回答6.3k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
我认为您可以通过请求对象获取 IP。
如果我没记错的话,
request.getRemoteAddr()
左右。