在网上看到什么通过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
代码如下
/**获取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
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货