首先是获取 ip,直接上代码
import org.springframework.web.context.request.requestcontextholder;
import org.springframework.web.context.request.servletrequestattributes;
import javax.servlet.http.httpservletrequest;
import java.net.inetaddress;
import java.net.unknownhostexception;
/**
* 获取ip地址工具类
*/
public final class iputil {
private static final string unknown = "unknown";
private static final string ipv6_local = "::1"; // 推荐用压缩形式
private iputil(){
throw new assertionerror();
}
/**
* 获取请求用户的ip地址
* @return
*/
public static string getrequestip() {
servletrequestattributes attributes = (servletrequestattributes) requestcontextholder.getrequestattributes();
httpservletrequest request = attributes.getrequest();
return getrequestip(request);
}
/**
* 获取请求用户的ip地址
* @param request
* @return
*/
public static string getrequestip(httpservletrequest request) {
string ip = request.getheader("x-forwarded-for");
// 处理多级代理,获取第一个非 unknown 的有效 ip
if (ip != null && !ip.isempty() && !unknown.equalsignorecase(ip)) {
ip = ip.split(",")[0].trim(); // 取第一个 ip
} else {
ip = request.getheader("x-real-ip"); // 常见于 nginx 代理
}
// 备用方案:尝试从其他头部获取
if (ip == null || ip.isempty() || unknown.equalsignorecase(ip)) {
ip = request.getheader("proxy-client-ip");
}
if (ip == null || ip.isempty() || unknown.equalsignorecase(ip)) {
ip = request.getheader("wl-proxy-client-ip");
}
if (ip == null || ip.isempty() || unknown.equalsignorecase(ip)) {
ip = request.getremoteaddr(); // 默认获取远程地址
}
// 如果是本地回环地址,则返回本地机器的 ip
if (ipv6_local.equals(ip) || "127.0.0.1".equals(ip)) {
ip = getlocalhostip(); // 获取本地 ip
}
return ip;
}
private static string getlocalhostip() {
try {
inetaddress inetaddress = inetaddress.getlocalhost();
return inetaddress.gethostaddress();
} catch (unknownhostexception e) {
e.printstacktrace();
return "127.0.0.1"; // 如果无法获取,则返回回环地址
}
}
}
但是今天发现一个问题,所有的地址都显示为 127.0.0.1,我一琢磨应该是 nginx 代理导致的,所以给 nginx 加上下面的配置
server {
listen 80;
server_name your-domain.com;
location / {
# 转发客户端的真实 ip
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header host $host;
# 代理转发请求到网关服务
proxy_pass http://localhost:1000/;
}
}
重启 nginx 后再次请求就拿到了真实的 ip 地址了(注意所谓的真实 ip 不一定真实,这个东西是可以伪造的,至于防范措施大家自己去搜,道高一尺魔高一丈)
到此这篇关于使用java实现获取客户端ip地址的文章就介绍到这了,更多相关java获取客户端ip地址内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论