天天看點

擷取伺服器真實ip

前置條件

 無

作者本人環境配置

 1.無

getHeader方法基本用法

                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());   

擷取真實ip

    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;

}

其他總結

      亂碼問題,如果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]+")來判斷這個字元串中是否有中文,如果沒有中文,則為亂碼或者數字或者英文或者其他符号,那麼我們則進行編碼轉換,如果是中文,則不進行編碼轉換