[英]Rest - how get IP address of caller
我正在編寫 Java Rest Web 服務並且需要調用者的 IP 地址。 我以為我曾經在 cookie 中看到過這個,但現在我沒有看到。 是否有一致的地方可以獲取這些信息?
我看到了一個使用“OperationalContext”來獲取它的例子,但這不是在java中。
將HttpServletRequest注入您的 Rest 服務,如下所示:
import javax.servlet.http.HttpServletRequest;
@GET
@Path("/yourservice")
@Produces("text/xml")
public String activate(@Context HttpServletRequest requestContext,@Context SecurityContext context){
String ipAddressRequestCameFrom = requestContext.getRemoteAddr();
//
String xForwardedForIP = req.getHeader("X-Forwarded-For");
//Also if security is enabled
Principal principal = context.getUserPrincipal();
String userName = principal.getName();
}
正如@Hemant Nagpal 所提到的,如果負載均衡器將其插入到請求中,您還可以檢查X-Forwarded-For標頭以確定真正的來源。 根據這個答案, getHeader()調用不區分大小寫。
我認為您可以通過請求對象獲取IP。
如果我沒記錯的話, request.getRemoteAddr()
左右。
你可以這樣做:
@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);
}
}
假設您正在使用 servlet 制作“Web 服務”,請求對象上的相當簡單的方法調用.getRemoteAddr()
將為您提供調用方的 IP 地址。
如果您的應用程序在位於反向代理或負載均衡器后面的網絡服務器上運行,則可以將該代理配置為在請求標頭中注入請求的 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.