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

时间:2010-09-29 19:23:49

标签: java web-services rest jax-rs restful-authentication

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

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

5 个答案:

答案 0 :(得分:35)

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

}

答案 1 :(得分:14)

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

如果我没弄错,request.getRemoteAddr()左右。

答案 2 :(得分: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); 

   }
}

答案 3 :(得分:1)

假设您正在使用servlet创建“Web服务”,请求对象上相当简单的方法调用.getRemoteAddr()将为您提供呼叫者IP地址。

答案 4 :(得分: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();
    }