2013-04-23 5 views
29

मैं एक साधारण सी समस्या के साथ कुछ समस्या हो रही है असली ग्राहक आईपी प्राप्त करें। मैं एक HTTPServlet अंदर असली ग्राहक आईपी मिलेगा।एक सर्वलेट

अब जब से मैं प्रयोग किया है:

request.getRemoteAddr() 

लेकिन अब यह एक झूठी आईपी देता है। उदाहरण: xxx.xxx.xxx। लेकिन मेरे आईपी xxx.xxx.xxx की तरह कुछ है। । (http://whatismyipaddress.com/ पर चेक किया गया)।

request.getHeader("X-Forwarded-For") 

यह NULL भेजता है:

अब मैं का उपयोग करने की कोशिश की।

मैं भी निम्नलिखित वर्ग के साथ एक जांच में ले लिया:

public class IpUtils { 

public static final String _255 = "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"; 
public static final Pattern pattern = Pattern.compile("^(?:" + _255 + "\\.){3}" + _255 + "$"); 

public static String longToIpV4(long longIp) { 
    int octet3 = (int) ((longIp >> 24) % 256); 
    int octet2 = (int) ((longIp >> 16) % 256); 
    int octet1 = (int) ((longIp >> 8) % 256); 
    int octet0 = (int) ((longIp) % 256); 

    return octet3 + "." + octet2 + "." + octet1 + "." + octet0; 
} 

public static long ipV4ToLong(String ip) { 
    String[] octets = ip.split("\\."); 
    return (Long.parseLong(octets[0]) << 24) + (Integer.parseInt(octets[1]) << 16) 
      + (Integer.parseInt(octets[2]) << 8) + Integer.parseInt(octets[3]); 
} 

public static boolean isIPv4Private(String ip) { 
    long longIp = ipV4ToLong(ip); 
    return (longIp >= ipV4ToLong("10.0.0.0") && longIp <= ipV4ToLong("10.255.255.255")) 
      || (longIp >= ipV4ToLong("172.16.0.0") && longIp <= ipV4ToLong("172.31.255.255")) 
      || longIp >= ipV4ToLong("192.168.0.0") && longIp <= ipV4ToLong("192.168.255.255"); 
} 

public static boolean isIPv4Valid(String ip) { 
    return pattern.matcher(ip).matches(); 
} 

public static String getIpFromRequest(HttpServletRequest request) { 
    String ip; 
    boolean found = false; 
    if ((ip = request.getHeader("x-forwarded-for")) != null) { 
     StringTokenizer tokenizer = new StringTokenizer(ip, ","); 
     while (tokenizer.hasMoreTokens()) { 
      ip = tokenizer.nextToken().trim(); 
      if (isIPv4Valid(ip) && !isIPv4Private(ip)) { 
       found = true; 
       break; 
      } 
     } 
    } 

    if (!found) { 
     ip = request.getRemoteAddr(); 
    } 

    return ip; 
} 
} 

यह भी xxx.xxx.xxx.50 आईपी लौट आए। :(

अब मैं अपने सर्वलेट कंटेनर से पहले कैसे वास्तविक ग्राहक आईपी प्राप्त करने के लिए पता नहीं। किसी को जानता है समाधान कृपया एक जवाब हो।

+0

सीधे इंटरनेट से जुड़ा हुआ अपने सर्वर है? क्या कोई राउटर, लोड बैलेंसर्स, एनएटी डिवाइस इत्यादि हैं? – mindas

+0

बस एक ruter है। – TAR515

उत्तर

27

मुझे लगता है आपकी समस्या यह है कि आप सर्वर स्थानीय नेटवर्क में कहीं चल रहे हैं यह है कि, ताकि आप उस नेटवर्क में आपके आईपी मिलता है। हालांकि जब आप ऑनलाइन सेवा का उपयोग करने की कोशिश कर रहे हैं जो आपके आईपी पते की खोज करता है तो आपका आईपी आपके सेवा प्रदाता के राउटर का आईपी है या ऐसा कुछ है। request.getRemoteAddr() का उपयोग करना सही है। यही वह सेवाएं है और उनके पास अन्य सुविधाएं नहीं हैं।

+0

मेरा सर्वर (सर्वलेट के साथ) और मेरा क्लाइंट एक ही पीसी पर चलता है। लेकिन मुझे लोकलहोस्ट आईपी के रूप में नहीं मिल रहा है क्योंकि क्लाइंट सर्वर से कनेक्ट होने पर वास्तविक आईपी का उपयोग करता है। 188.xxx.xxx.158। मैंने अब से इसका इस्तेमाल किया और यह सही काम किया, यह पहली बार है जब मुझे झूठा आईपी मिलता है। – TAR515

12

जब आप नेट (नेटवर्क एड्रेस ट्रांसलेशन) है डिवाइस request.getRemoteAddr() आप से अनुरोध हेडर लेने के लिए तो फिर तुम एक हैडर मूल क्लाइंट का IP में भेजने के लिए नेट कॉन्फ़िगर नेट का पता देता है, के बाद से यह एक नया कनेक्शन आरंभ।

अपनी समस्या को हल करने के लिए करना चाहिए। ,। में आप नेट में कॉन्फ़िगर मामले एक्स Forwarded-For शीर्षलेख उपयोग इस कोड: request.getHeader("X-Forwarded-For")

0,123,

आप काम सही है, आप इसे एनएटी कॉन्फ़िगर करते समय इसका उपयोग कर सकते हैं।

+0

मैं किसी भी एनएटी डिवाइस का उपयोग नहीं करता, जैसा कि मुझे पता है :) – TAR515

8

जावा

String ip = request.getRemoteAddr(); 
if (ip.equalsIgnoreCase("0:0:0:0:0:0:0:1")) { 
    InetAddress inetAddress = InetAddress.getLocalHost(); 
    String ipAddress = inetAddress.getHostAddress(); 
    ip = ipAddress; 
} 
model.addAttribute("IP", ip); 

JSP <span><B>IP : <c:out value="${IP}" /></B></span> // Spring MAV 

JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<%@ page import="java.net.InetAddress" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Displays Client IP Address</title> 
</head> 
<body> 
<% 
    // paste above java code 
out.println("<br><B>Clients IP : </B>"+ip); 
%> 
<span><br>Local Host : <%= request.getRemoteAddr() %></span> 
<span><br>ServerPort : <%= request.getServerPort() %></span> 
<span><br>Path  : <%= request.getRequestURI()%></span> 
</span> 
</body> 
</html> 

jsp स्थानीय सर्वर में आ जाता है और इस jsp तक पहुँचने 0 लौटाता है: 0: 0: 0: 0: 0: 0 : 1। यदि आईपी के साथ स्थानीय रूप से एप्लिकेशन का उपयोग करना है तो यह आईपी लौटाता है।

RESTful जर्सी

@javax.ws.rs.Path("/ip") 
public class GetIPInfo { 

    @GET @Produces(MediaType.TEXT_PLAIN) 
    public Response getIP(@Context javax.servlet.http.HttpServletRequest request) throws UnknownHostException { 

     String remoteHost = request.getRemoteHost(); 
     String remoteAddr = request.getRemoteAddr(); 
     if (remoteAddr.equals("0:0:0:0:0:0:0:1")) { 
      InetAddress localip = java.net.InetAddress.getLocalHost(); 
      remoteAddr = localip.getHostAddress(); 
      remoteHost = localip.getHostName(); 
     } 
     int remotePort = request.getRemotePort(); 

     String msgoutput = remoteHost + " (" + remoteAddr + " : " + remotePort + ")"; 
     return Response.status(200).entity(msgoutput).build(); 
    } 
} 

जावास्क्रिप्ट का उपयोग के साथ वेब सेवा को खोजने के लिएIP

संबंधित मुद्दे