在網上看到什么通過X-Forwarded-For,X-Real-IP.我測驗都是獲取到Nginx的地址(127.0.0.1),
代碼如下
/**獲取ip工具類 */
public class IpUtil {
/**
* 穿透反向代理服務器,獲取ip地址
*
* @param request
* @return
*/
public static String getIpThroughProxy(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
//多次反向代理后會有多個ip值,第一個ip才是真實ip
int index = ip.indexOf(",");
if (index != -1) {
return ip.substring(0, index);
} else {
return ip;
}
}
ip = request.getHeader("X-Real-IP");
if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
return ip;
}
return request.getRemoteAddr();
}
/**
* 獲取客戶端IP,支持反向代理,如nginx,但不支持正向代理,比如客戶端瀏覽器自己使用代理工具
* @param request
* @return 客戶端IP
*/
public static String getClientIP(HttpServletRequest request)
{
String ip = request.getHeader("X-Real-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("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();
return ip;
}
}
Controller類:
@Controller
public class IndexController {
@GetMapping("/test")
@ResponseBody
@RequiresGuest
public String hello(HttpServletRequest request) {
String ip1 = IpUtil.getClientIP(request);
String ip2 = IpUtil.getIpThroughProxy(request);
System.out.printf("ip1 = %s.ip2 = %s",ip1,ip2);
return ip1;
}
}
Nginx.conf組態檔:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://WeChat;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream WeChat {
server 127.0.0.1:8080;
}
結果
輸出ip1 和ip2都是127.0.0.1
uj5u.com熱心網友回復:
你這個代碼沒問題啊難道不是因為你在本地訪問拿到的ip也是本地的原因?
uj5u.com熱心網友回復:
用內網穿透,然后手機訪問的
uj5u.com熱心網友回復:
配置完了,nginx沒有重啟?
uj5u.com熱心網友回復:
驚, nginx 和 所謂真實 ip的真相:https://blog.csdn.net/weixin_44050791/article/details/105282172轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/100469.html
標籤:Java EE
上一篇:一名學APP開發的,JavaGUI這一部分要不要學?求大佬告知!!!
下一篇:使用jdbc連接mysql資料庫例外“Client does not support authentication protocol requested by”
