我正在编写Java Rest Web服务并需要调用者的IP地址。我以为我曾经在cookie中看到过这个,但现在我没有看到它。是否有一致的地方来获取这些信息?
我看到了一个使用“OperationalContext”来获取它的例子,但这不是在java中。
答案 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();
}