1. 程式人生 > >java 後臺獲取ip和js 獲取ip

java 後臺獲取ip和js 獲取ip

java:

鎝

在jsp得到客戶端的ip地址有下面的方法


1.<input type="hidden" id="jiqiIP" name="jiqiIP"value="<%=request.getRemoteAddr()%>"/>
在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。

如果使用了反向代理軟體,將http://192.168.1.110:2046/ 的URL反向代理為 http://www.javapeixun.com.cn / 的URL時,用request.getRemoteAddr()方法獲取的IP地址是:127.0.0.1 或 192.168.1.110,而並不是客戶端的真實IP。

經過代理以後,由於在客戶端和服務之間增加了中間層,因此伺服器無法直接拿到客戶端的 IP,伺服器端應用也無法直接通過轉發請求的地址返回給客戶端。但是在轉發請求的HTTP頭資訊中,增加了X-FORWARDED-FOR資訊。用以跟蹤 原有的客戶端IP地址和原來客戶端請求的伺服器地址。當我們訪問index.jsp/時,其實並不是我們瀏覽器真正訪問到了伺服器上的index.jsp 檔案,而是先由代理伺服器去訪問index.jsp ,代理伺服器再將訪問到的結果返回給我們的瀏覽器,因為是代理伺服器去訪問index.jsp的,所以index.jsp中通過 request.getRemoteAddr()的方法獲取的IP實際上是代理伺服器的地址,並不是客戶端的IP地址。

2.<script language="JavaScript" src="http://www.hashemian.com/js/visitorIP.js.php"></script>這一段,可以得到客戶端的公網ip地址

<a href="http://tool.keleyi.com" target="_blank">首頁</a><br />
您的IP地址是:<span id="keleyivisitorip"></span>
<script type="text/javascript" src="http://tool.keleyi.com/ip/visitoriphost/"></script>
3.<iframe src="http://www.ip138.com/ipCity.jsp" id="frame1"&gt;</iframe>用這個iframe也可以得到客戶端公網ip,但是IE卻很難得到iframe裡面的值,不論是控制iframe

還是用ajax訪問那個url路徑都不能得到,因為IE會報錯說拒絕訪問,最主要的原因是你跨域了(從網上找到的:如果可以跨的話,你不是可以隨便修改別人網站的內容了嗎?比如

你在iframe里加載了百度,你又能通過js控制它,這不是為黑客提供了便利的途徑嗎),因此無法得到ip,當你不跨域的時候是可以的,如下
myiframe.contentWindow.document.body.innerHTML方式直接通過iframe的id引用,只有IE系列瀏覽器支援,在其它標準瀏覽器中無效。

火狐還支援這種方法得到iframe的值,但是IE不支援contentDocument

<html>
<head>
<script type="text/javascript">
function getText(){
  varx=document.getElementByIdx_x_x_x_x("frame1").contentDocument;
 alert(x.getElementsByTagName_r("h3")[0].childNodes[0].nodeValue);
 }
</script>
</head>
<body>

<iframe src="http://www.ip138.com/ip2city.asp"id="frame1"></iframe>
<br /><br/>
<input type="button" onclick="getText()" value="Gettext" />

</body>

</html>

那麼我們可以得出獲得客戶端真實IP地址的方法一:

鎝

那麼我們可以得出獲得客戶端真實IP地址的方法二:

 1 /**
 2      * 獲取訪問者IP
 3      * 
 4      * 在一般情況下使用Request.getRemoteAddr()即可,但是經過nginx等反向代理軟體後,這個方法會失效。
 5      * 
 6      * 本方法先從Header中獲取X-Real-IP,如果不存在再從X-Forwarded-For獲得第一個IP(用,分割),
 7      * 如果還不存在則呼叫Request .getRemoteAddr()。
 8      * 
 9      * @param request
10      * @return
11      */
12     public static String getIpAddr(HttpServletRequest request) {
13         String ip = request.getHeader("X-Real-IP");
14         if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
15             return ip;
16         }
17         ip = request.getHeader("X-Forwarded-For");
18         if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
19             // 多次反向代理後會有多個IP值,第一個為真實IP。
20             int index = ip.indexOf(',');
21             if (index != -1) {
22                 return ip.substring(0, index);
23             } else {
24                 return ip;
25             }
26         } else {
27             return request.getRemoteAddr();
28         }
29     }


如果通過了多級反向代理的話,X-Forwarded-For的值並不止一個,而是一串IP值,究竟哪個才是真正的使用者端的真實IP呢?
    答案是取X-Forwarded-For中第一個非unknown的有效IP字串。如:
    X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
    使用者真實IP為: 192.168.1.110