用訂制音樂(lè)網(wǎng)站做的音樂(lè)算原創(chuàng)嗎百度關(guān)鍵詞優(yōu)化專家
Java之獲取Nginx代理之后的客戶端IP
Nginx代理接口之后,后臺(tái)獲取的IP地址都是127.0.0.1,解決辦法是需要配置Nginx搭配后臺(tái)獲取的方法,獲得設(shè)備的真實(shí)地址。我們想要獲取的就是nginx代理日志中的這個(gè)IP
nginx配置
首先在nginx代理的對(duì)應(yīng)location增加如下配置
#保留代理之前的host 包含客戶端真實(shí)的域名和端口號(hào)
proxy_set_header Host $host;
#保留代理之前的真實(shí)客戶端ip
proxy_set_header X-Real-IP $remote_addr;
#這個(gè)Header和X-Real-IP類似,但它在多級(jí)代理時(shí)會(huì)包含真實(shí)客戶端及中間每個(gè)代理服務(wù)器的IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#表示客戶端真實(shí)的協(xié)議(http還是https)
proxy_set_header X-Forwarded-Proto $scheme;
示例
server {listen 9010;server_name 127.0.0.1;location ^~ /tob_server/ {#代理地址proxy_pass http://127.0.0.1:9012/tob_server/;#保留代理之前的host 包含客戶端真實(shí)的域名和端口號(hào)proxy_set_header Host $host; #保留代理之前的真實(shí)客戶端ipproxy_set_header X-Real-IP $remote_addr; #這個(gè)Header和X-Real-IP類似,但它在多級(jí)代理時(shí)會(huì)包含真實(shí)客戶端及中間每個(gè)代理服務(wù)器的IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#表示客戶端真實(shí)的協(xié)議(http還是https)proxy_set_header X-Forwarded-Proto $scheme;#解決跨域add_header Access-Control-Allow-Origin *;#解決nginx轉(zhuǎn)發(fā)丟失cookie的問(wèn)題proxy_cookie_path /tob_server/ /;#解決options請(qǐng)求if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}}location \ {root html;index index.html index.htm;}#解決代理異常error_page 404 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
java獲取客戶端IP
獲取客戶端IP地址工具類
public class IpUtils
{private static Logger logger = LoggerFactory.getLogger(IPUtils.class);/*** 獲取客戶端IP* * @param request 請(qǐng)求對(duì)象* @return IP地址*/public static String getIpAddr(HttpServletRequest request){if (request == null){return "unknown";}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("X-Forwarded-For");}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.getHeader("X-Real-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ip = request.getRemoteAddr();}return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);}/*** 從多級(jí)反向代理中獲得第一個(gè)非unknown IP地址** @param ip 獲得的IP地址* @return 第一個(gè)非unknown IP地址*/public static String getMultistageReverseProxyIp(String ip){// 多級(jí)反向代理檢測(cè)if (ip != null && ip.indexOf(",") > 0){final String[] ips = ip.trim().split(",");for (String subIp : ips){if (false == isUnknown(subIp)){ip = subIp;break;}}}return StringUtils.substring(ip, 0, 255);}/*** 檢測(cè)給定字符串是否為未知,多用于檢測(cè)HTTP請(qǐng)求相關(guān)** @param checkString 被檢測(cè)的字符串* @return 是否未知*/public static boolean isUnknown(String checkString){return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);}
}
這樣就可以通過(guò)代碼獲取到客戶端的真實(shí)IP地址了。
參考文章:
https://blog.csdn.net/u012812482/article/details/126066550