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

问题描述 投票:26回答:5

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

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

java web-services rest jax-rs restful-authentication
5个回答
16
投票

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

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


40
投票

像这样将HttpServletRequest注入您的Rest Service:

import javax.servlet.http.HttpServletRequest;

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

   String ipAddressRequestCameFrom = requestContext.getRemoteAddr();

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

}

5
投票

您可以执行以下操作:

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

   }
}

1
投票

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


0
投票

如果您的应用程序在反向代理或负载均衡器后面的Web服务器上运行,则可以将该代理配置为将请求的IP地址注入请求标头中。不同的反向代理可以注入不同的标头。请查阅代理服务器的文档。我们在下面的示例中列出了几个最常用的,但这绝不是完整列表。当您的客户端使用(转发)代理时,它可能会插入标头以说明客户端IP地址。否则可能不会。并且此处插入的IP地址可能不正确。这意味着您通过调用request.getRemoteAddr()获得的值是请求的直接上游源的IP地址。如前所述,有许多用于不同代理的标头,但是x-forwareded-for最有可能由代理插入。最后一点,即使您从标头或request.getRemoteAddr()获取IP地址,也不保证它是客户端IP地址。例如:如果您的代理服务器不包含客户端的IP地址,那么您将获得代理服务器或负载平衡器的IP地址。如果您的客户端在专用网络上工作并通过NAT网关连接到Internet,则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();
    }
© www.soinside.com 2019 - 2024. All rights reserved.