天天看點

servlet/jsp中getHeader擷取ip

<b>前置條件</b>

 無

<b>作者本人環境配置</b>

 1.無

<b>getheader方法基本用法</b>

                system.out.println("rotocol: " + request.getprotocol());   

system.out.println("scheme: " + request.getscheme());   

system.out.println("server name: " + request.getservername() );   

system.out.println("server port: " + request.getserverport());   

system.out.println("rotocol: " + request.getprotocol());   

system.out.println("server info: " + getservletconfig().getservletcontext().getserverinfo());   

system.out.println("remote addr: " + request.getremoteaddr());   

system.out.println("remote host: " + request.getremotehost());   

system.out.println("character encoding: " + request.getcharacterencoding());   

system.out.println("content length: " + request.getcontentlength());   

system.out.println("content type: "+ request.getcontenttype());   

system.out.println("auth type: " + request.getauthtype());   

system.out.println("http method: " + request.getmethod());   

system.out.println("ath info: " + request.getpathinfo());   

system.out.println("ath trans: " + request.getpathtranslated());   

system.out.println("query string: " + request.getquerystring());   

system.out.println("remote user: " + request.getremoteuser());   

system.out.println("session id: " + request.getrequestedsessionid());   

system.out.println("request uri: " + request.getrequesturi());   

system.out.println("servlet path: " + request.getservletpath());   

system.out.println("accept: " + request.getheader("accept"));   

system.out.println("host: " + request.getheader("host"));   

system.out.println("referer : " + request.getheader("referer"));   

system.out.println("accept-language : " + request.getheader("accept-language"));   

system.out.println("accept-encoding : " + request.getheader("accept-encoding"));   

system.out.println("user-agent : " + request.getheader("user-agent"));   

system.out.println("connection : " + request.getheader("connection"));   

system.out.println("cookie : " + request.getheader("cookie"));   

system.out.println("created : " + session.getcreationtime());   

<b>擷取真實ip</b>

    jsp裡,擷取用戶端的ip位址的方法是:request.getremoteaddr(),這種方法在大部分情況下都是有效的。但是在通過了 apache,nagix等反向代理軟體就不能擷取到用戶端的真實ip位址了。如果使用了反向代理軟體,用 request.getremoteaddr()方法擷取的ip位址是:127.0.0.1或 192.168.1.110,而并不是用戶端的真實ip。

      經過代理以後,由于在用戶端和服務之間增加了中間層,是以伺服器無法直接拿到用戶端的 ip,伺服器端應用也無法直接通過轉發請求的位址傳回給用戶端。但是在轉發請求的http頭資訊中,增加了x-forwarded-for資訊。用以跟蹤原有的用戶端 ip位址和原來用戶端請求的伺服器位址。

   下面是擷取真實ip的一種方法,可以參考

               /**

* 擷取用戶端ip

* @return

*/

protected string getip() {

httpservletrequest request = this.getrequest();

string ip = request.getheader("x-forwarded-for");

if (ip == null || ip.length() == 0 || "unknown".equalsignorecase(ip)) {

ip = request.getheader("proxy-client-ip");

}

ip = request.getheader("wl-proxy-client-ip");

ip = request.getremoteaddr();

return ip.trim().equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;

<b>其他總結</b>

      亂碼問題,如果request.getheader("referer")連結中帶有中文參數,那麼在經過跳轉的時候,就會出現亂碼,這個時候需要用到string keywords = new string(str.getbytes("iso-8859-1"),"gbk");來進行編碼轉換!可是如果不是通過request.getheader("referer")連結鍊過來的也用keywords = new string(str.getbytes("iso-8859-1"),"gbk");來進行編碼轉換的話,就會出現亂碼,解決的辦法,首先,我用str.matches( "[\\u4e00-\\u9fa5]+")來判斷這個字元串中是否有中文,如果沒有中文,則為亂碼或者數字或者英文或者其他符号,那麼我們則進行編碼轉換,如果是中文,則不進行編碼轉換