Java直接取IP的方法:
import javax.servlet.http.HttpServletRequest; request.getRemoteAddr();
但这个方法只适用于没有使用nginx等代理的项目,如果是有做代理的项目,在每通过一次代理的时候都需要把真实ip存好,这样到了后台服务器时我们才能取到真实ip而不是代理服务器的ip。
以nginx代理为例:
我们需要在nginx中进行配置一些请求头存放信息:
server {
listen 6000; #监听端口 http的网络端口80 https 443 ssl (这个要配置秘钥)
server_name localhost;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
location / {
root html;
index index.html index.htm;
}
}
$remote_addr:存放的是当前请求来的ip,常用存放真实ip的头
X-Forwarded-For:它的值是每经过一层代理,它会将每层获取的ip以逗号分隔,而请求的真实ip将会被放在第一个,我们取这个即可
方式一:直接调用Hutool工具的api,获取真实ip:
import cn.hutool.extra.servlet.ServletUtil;
public static String getIpAddr(HttpServletRequest request) {
String clientIP = ServletUtil.getClientIP(request, null);
System.out.println("获取到的ip=" + clientIP);
return clientIP;
}
方式二:
/**
* 获取用户真实IP地址,不使用request.getRemoteAddr()的原因是有可能用户使用了代理软件方式避免真实IP地址,
* 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值
*
* @return ip
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
System.out.println("x-forwarded-for ip: " + ip);
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个ip值,第一个ip才是真实ip
if (ip.indexOf(",") != -1) {
ip = ip.split(",")[0];
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
// System.out.println("Proxy-Client-IP ip: " + ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
// System.out.println("WL-Proxy-Client-IP ip: " + ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
// System.out.println("HTTP_CLIENT_IP ip: " + ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
// System.out.println("HTTP_X_FORWARDED_FOR ip: " + ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
// System.out.println("X-Real-IP ip: " + ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
// System.out.println("getRemoteAddr ip: " + ip);
}
// System.out.println("获取客户端ip: " + ip);
return ip;
}
参考: