引言
nginx做反向代理時,默認的配置后端獲取到的ip地址都來自于nginx,用request.getremoteaddr();獲取到的是nginx的ip地址,而不是用戶的真實ip.
1.修改Nginx配置:
????server?{ ????????listen???????80; ????????server_name??jenkins.local.com; ????????location?/?{ ????????????proxy_set_header?Host?$host; ????????????proxy_set_header?X-Real-IP?$remote_addr; ????????????proxy_pass?http://192.168.10.204:8899;??? ?????????} ?????????error_page???500?502?503?504??/50x.html; ?????????location?=?/50x.html?{ ????????????root???html; ????????????index??index.html?index.htm?index.jsp?index.action?default.html; ?????????} ???????????proxy_set_header?Host?$host; ????????proxy_set_header?X-Real-IP?$remote_addr; ????????proxy_set_header?X-Forwarded-For?$proxy_add_x_forwarded_for; ????}
在原來的基礎配置上加上后三行配置,就可以使用request.getHeader(“x-forwarded-for”)來獲取用戶真實的Ip地址了
2.java獲取客戶端Ip
package?com.zimax.cqyf.admin.util; import?javax.servlet.http.HttpServletRequest; import?java.net.InetAddress; import?java.net.UnknownHostException; ? /** ?*?http工具類 ?*/ public?class?HttpUtils?{ ????/** ?????*?獲取真實的ip ?????*?@param?request ?????*?@return ?????*?@throws?UnknownHostException ?????*/ ????public?static?String?getRealIp(HttpServletRequest?request){ ????????String?ip; ????????//?有的user可能使用代理,為處理用戶使用代理的情況,使用x-forwarded-for ????????if??(request.getHeader("x-forwarded-for")?==?null)??{ ????????????ip?=?request.getRemoteAddr(); ????????}??else??{ ????????????ip?=?request.getHeader("x-forwarded-for"); ????????} ????????if??("127.0.0.1".equals(ip))??{ ????????????try?{ ????????????????//?獲取本機真正的ip地址 ????????????????ip?=?InetAddress.getLocalHost().getHostAddress(); ????????????}catch?(Exception?e){ ????????????????e.printStackTrace(); ????????????} ????????} ????????return?ip; ????}? }
附:一個ip工具類
import?javax.servlet.http.HttpServletRequest; /** *?IP地址工具類 *?@author?xudongdong * */ public?class?IpUtil?{ ???? ????/** ?????*?私有化構造器 ?????*/ ????private?IpUtil()?{ ????} ????/** ?????*?獲取真實IP地址 ?????*?<p>使用getRealIP代替該方法</p> ?????*?@param?request?req ?????*?@return?ip ?????*/ ????@Deprecated ????public?static?String?getClinetIpByReq(HttpServletRequest?request)?{ ????????//?獲取客戶端ip地址 ????????String?clientIp?=?request.getHeader("x-forwarded-for"); ????????if?(clientIp?==?null?||?clientIp.length()?==?0?||?"unknown".equalsIgnoreCase(clientIp))?{ ????????????clientIp?=?request.getHeader("Proxy-Client-IP"); ????????} ????????if?(clientIp?==?null?||?clientIp.length()?==?0?||?"unknown".equalsIgnoreCase(clientIp))?{ ????????????clientIp?=?request.getHeader("WL-Proxy-Client-IP"); ????????} ????????if?(clientIp?==?null?||?clientIp.length()?==?0?||?"unknown".equalsIgnoreCase(clientIp))?{ ????????????clientIp?=?request.getRemoteAddr(); ????????} ????????/* ?????????*?對于獲取到多ip的情況下,找到公網ip. ?????????*/ ????????String?sIP?=?null; ????????if?(clientIp?!=?null?&&?!clientIp.contains("unknown")?&&?clientIp.indexOf(",")?>?0)?{ ????????????String[]?ipsz?=?clientIp.split(","); ????????????for?(String?anIpsz?:?ipsz)?{ ????????????????if?(!isInnerIP(anIpsz.trim()))?{ ????????????????????sIP?=?anIpsz.trim(); ????????????????????break; ????????????????} ????????????} ????????????/* ?????????????*?如果多ip都是內網ip,則取第一個ip. ?????????????*/ ????????????if?(null?==?sIP)?{ ????????????????sIP?=?ipsz[0].trim(); ????????????} ????????????clientIp?=?sIP; ????????} ????????if?(clientIp?!=?null?&&?clientIp.contains("unknown")){ ????????????clientIp?=clientIp.replaceAll("unknown,",?""); ????????????clientIp?=?clientIp.trim(); ????????} ????????if?("".equals(clientIp)?||?null?==?clientIp){ ????????????clientIp?=?"127.0.0.1"; ????????} ????????return?clientIp; ????} ???? ????/** ?????*?判斷IP是否是內網地址 ?????*?@param?ipAddress?ip地址 ?????*?@return?是否是內網地址 ?????*/ ????public?static?boolean?isInnerIP(String?ipAddress)?{ ????????boolean?isInnerIp; ????????long?ipNum?=?getIpNum(ipAddress); ????????/**??? ????????私有IP:A類??10.0.0.0-10.255.255.255??? ???????????????B類??172.16.0.0-172.31.255.255??? ???????????????C類??192.168.0.0-192.168.255.255??? ????????當然,還有127這個網段是環回地址??? ????????**/ ????????long?aBegin?=?getIpNum("10.0.0.0"); ????????long?aEnd?=?getIpNum("10.255.255.255"); ???????? ????????long?bBegin?=?getIpNum("172.16.0.0"); ????????long?bEnd?=?getIpNum("172.31.255.255"); ???????? ????????long?cBegin?=?getIpNum("192.168.0.0"); ????????long?cEnd?=?getIpNum("192.168.255.255"); ????????isInnerIp?=?isInner(ipNum,?aBegin,?aEnd)?||?isInner(ipNum,?bBegin,?bEnd)?||?isInner(ipNum,?cBegin,?cEnd) ????????????????||?ipAddress.equals("127.0.0.1"); ????????return?isInnerIp; ????} ????private?static?long?getIpNum(String?ipAddress)?{ ????????String[]?ip?=?ipAddress.split("."); ????????long?a?=?Integer.parseInt(ip[0]); ????????long?b?=?Integer.parseInt(ip[1]); ????????long?c?=?Integer.parseInt(ip[2]); ????????long?d?=?Integer.parseInt(ip[3]); ????????return?a?*?256?*?256?*?256?+?b?*?256?*?256?+?c?*?256?+?d; ????} ???? ????private?static?boolean?isInner(long?userIp,?long?begin,?long?end)?{ ????????return?(userIp?>=?begin)?&&?(userIp?=2)?return?clientIps[clientIps.length-2].trim(); ????????} ????????return?clientIps[clientIps.length-1].trim(); ????} ????private?static?boolean?isComefromCDN(HttpServletRequest?request)?{ ????????String?host?=?request.getHeader("host"); ????????return?host.contains("www.189.cn")?||host.contains("shouji.189.cn")?||?host.contains( ????????????????"image2.chinatelecom-ec.com")?||?host.contains( ????????????????"image1.chinatelecom-ec.com"); ????} }
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END