1. 程式人生 > >Java獲取客戶端/訪問者真實IP地址的兩種方法

Java獲取客戶端/訪問者真實IP地址的兩種方法

在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。
在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。 http://bbs.it-home.org/ 的URL時,用request.getRemoteAddr()方法獲取的IP地址是:127.0.0.1 或 192.168.1.110,而並不是客戶端的真實IP。

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

    於是可得出獲得客戶端真實IP地址的方法一:

  1. public String getRemortIP(HttpServletRequest request) {
  2.   if (request.getHeader("x-forwarded-for") == null) {
  3.    return request.getRemoteAddr();
  4.   }
  5.   return request.getHeader("x-forwarded-for");
  6. }
複製程式碼 可是當我訪問http://bbs.it-home.org/index.jsp/ 時,返回的IP地址始終是unknown,也並不是如上所示的127.0.0.1 或 192.168.1.110了,而我訪問
http://192.168.1.110
:2046/index.jsp 時,則能返回客戶端的真實IP地址,寫了個方法去驗證。原因出在了Squid上。squid.conf 的配製檔案 forwarded_for 項預設是為on,如果 forwarded_for 設成了 off  則:X-Forwarded-For: unknown
   
於是可得出獲得客戶端真實IP地址的方法二:
  1. public String getIpAddr(HttpServletRequest request) {
  2.        String ip = request.getHeader("x-forwarded-for");
  3.        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  4.            ip = request.getHeader("Proxy-Client-IP");
  5.        }
  6.        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  7.            ip = request.getHeader("WL-Proxy-Client-IP");
  8.        }
  9.        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  10.            ip = request.getRemoteAddr();
  11.        }
  12.        return ip;
  13.    }
複製程式碼
可是,如果通過了多級反向代理的話,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

相關推薦

Java獲取客戶/訪問者真實IP地址方法

在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。在JSP裡,獲取客戶端的IP地址的方法是:request.get

Java獲取客戶使用者真實IP地址

在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid,nginx等反向代理軟體就不能獲取到客戶端的真實IP地址了。 如果使用了反向代理軟體,將http://192.168.1.110

php 獲取客戶真實IP地址 和 檢查客戶從什麼地方過來的請求

/* * 函式功能: 獲取客戶端的真實IP地址 * * 為什麼要用這個函式? * 因為我們線上Web伺服器絕大部分都處於Netscaler(簡稱NS)後面,客戶端訪問的地址統一由NS排程 * 由NS排程的訪問其實就是NS做了一層代理, 這期間就有一個問題, 因為真實

Java獲取客戶所在的IP地址和伺服器地址

/** 2 * 獲取本地IP地址 3 * @return 4 */ public static void main(String[] args) { 2

Java獲取請求客戶真實IP地址

整理網友的材料,最後有原始碼,親測能解決所有java獲取IP真實地址的問題整理的這裡:1、連結12、連結2JSP裡,獲取客戶端的IP地址的方法是: request.getRemoteAddr() ,這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向

獲取當前訪問客戶真實IP地址(含內網地址

在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。如果使用了反向代理軟體,用request.getRemoteAd

獲取當前訪問客戶真實IP地址,辨別是否為內網?

Test.jsp  測試頁面 TestAddress tsetadres = new TestAddress(); String addIP = request.getRemoteAddr();  if(!addIP.equals("")) {  String relIp

Java獲取客戶及區域網ip和埠地址

在java專案Controller層加入下面程式碼: public Map<String,Object>selectAccessory(HttpServletRequest request){ //public Map<String,Object>

nginx反向代理後獲取不到客戶真實ip地址

location / {    proxy_pass http://127.0.0.1:10678;    proxy_set_header Host $host; //加入下面配置         proxy_set_header X-Real-IP $remo

獲取客戶真實IP

pan bsp 公網 @param add acea user sig n) /** * 獲取真實IP地址 * <p>使用getRealIP代替該方法</p> * @param request req * @

JAVA獲取客戶請求電腦IP,作業系統等等各種資訊

HttpServletRequest request = ServletActionContext.getRequest(); System.out.println("瀏覽器基本資訊:"+reque

Java獲取客戶真實IP地址方法

在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。     如果使用了反向代理軟體,將http://192.168

Java獲取客戶真實IP地址

1、我們一般在程式開發時,總會用到這種獲取訪問者IP的功能,以便記錄客戶端的登入和訪問行為。一般情況下,我們可以使用 request 的 getRemoteAddr() 方法獲取客戶端實際 IP ,但是 Nginx 使用反向代理後,我們使用 getRemo

java獲取客戶ip地址

public static String getIp2(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if(StringUtils.isNotEmpty(ip) && !"unKn

java IP地址工具類,java IP地址獲取java獲取客戶IP地址

java IP地址工具類,java IP地址獲取,java獲取客戶端IP地址   ================================ ©Copyright 蕃薯耀 2019年1月11日 http://fanshuyao.iteye.com/   impo

Java獲取客戶IP

不為 pty 獲取 code 中間 clas 代理服務器 gin servle 在開發工作中,我們常常需要獲取客戶端的IP。一般獲取客戶端的IP地址的方法是:request.getRemoteAddr();但是在通過了Apache,Squid等反向代理軟件就不能獲取到客戶端

java獲取客戶IP和服務器IP

ati () ted unknown lock back thead ssi 簡單的 一、Java獲取服務器IP(轉自:https://www.cnblogs.com/george93/p/6306579.html) //方法一,也是最簡單的一種。 String

java web獲取客戶外網ip和所在區域

@參考文章1、@參考文章2、@參考文章3、@參考文章4,@之前同事的專案  controller @Controller @RequestMapping("/home") public class HomeController { @RequestMappin

Dorado7 AjaxAction Java獲取客戶IP

@Expose @DataProvider public String getCurrentEmployeeUserPrivilege(HttpServletRequest request, HttpServletResponse response){ String ip = req

PHP獲取真實客戶真實IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

REMOTE_ADDR 是你的客戶端跟你的伺服器“握手”時候的IP。如果使用了“匿名代理”,REMOTE_ADDR將顯示代理伺服器的IP。  HTTP_CLIENT_IP 是代理伺服器傳送的HTTP頭。如果是“超級匿名代理”,則返回none值。同樣,REMOTE_ADDR也會被替換為這個代