1、直接訪問tomcat的情況
通過下面這段代碼可以獲取:
String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getHeader("WL-Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ ip = request.getRemoteAddr(); }
主要的方法是通過請求的header中的信息獲取,若獲取不到則使用request.getRemoteAddr()方法獲取。
另外,如果遇到這個問題也有解決辦法:
request.getRemoteAddr() 獲取的值為0:0:0:0:0:0:0:1的原因及解決辦法
最近在進行web開發時,在jsp頁面獲取服務器ip時,遇到了request.getRemoteAddr()獲取的值為0:0:0:0:0:0:0:1,這是為什么呢,照道理講,應該是127.0.0.1才對,為什么這個獲取的值變成了ipv6了呢,而且我發現這種情況只有在服務器和客戶端都在同一台電腦上才會出現(例如用localhost訪問的時候才會出現),后來上網查了查原因,原來是/etc/hosts這個東西作怪(在windows上應該是C:\Windows\System32\drivers\etc\hosts這個文件),只需要注釋掉文件中的 # ::1 localhost 這一行即可解決問題。另外localhost這個文件很有用,這里你可以添加自己的條目,例如添加 192.168.0.212 myweb 這樣子,在瀏覽器中原來只能使用192.168.0.212來訪問的,並可以使用myweb來進行替換。
如果還不能解決,本機訪問的時候用127.0.0.1或本機ip代替localhost即可解決
2、在訪問tomcat之前經過了nginx代理的情況
經過代理的話,tomcat記錄的訪問者ip按道理來說就是代理服務器的ip,然而我們是要獲取用戶的真實ip的。
機智的前輩們當然已經幫我們鋪好路了,通過修改Nginx配置就可以完成。具體配置如下:
server { listen 80; server_name abc.com; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
加入上面加粗的那一行就OK了,可以在tomcat端通過getHeader("x-forwarded-for")獲取到訪問者的ip了。
原理:
意思是增加一個$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆蓋,當然由於默認的X-Forwarded-For值是空的,所以我們總感覺X-Forwarded-For的值就等於$proxy_add_x_forwarded_for的值,實際上當你搭建兩台nginx在不同的ip上,並且都使用了這段配置,那你會發現在web服務器端通過request.getAttribute("X-Forwarded-For")獲得的將會是客戶端ip和第一台nginx的ip。
那么$proxy_add_x_forwarded_for又是什么?
$proxy_add_x_forwarded_for變量包含客戶端請求頭中的"X-Forwarded-For",與$remote_addr兩部分,他們之間用逗號分開。
3、在tomcat日志中開啟對訪問者ip的記錄
修改tomcat下的/conf/server.xml,將以下配置開啟(默認為注釋狀態),
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />