休息 - 如何获取呼叫者的IP地址
2022-09-01 13:52:48
我正在编写 Java Rest Web 服务,需要调用方的 IP 地址。我以为我曾经在饼干中看到过这个,但现在我没有看到它。是否有一致的位置来获取此信息?
我看到一个使用“OperationalContext”来获取它的例子,但那不是在java中。
我正在编写 Java Rest Web 服务,需要调用方的 IP 地址。我以为我曾经在饼干中看到过这个,但现在我没有看到它。是否有一致的位置来获取此信息?
我看到一个使用“OperationalContext”来获取它的例子,但那不是在java中。
将 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
我认为您可以通过请求对象获取IP。
如果我没有记错的话,或者说。request.getRemoteAddr()