基于nginx反向代理如何获取用户真实Ip地址
发布时间 - 2023-05-13 00:00:00 点击率:次引言
nginx做反向代理时,默认的配置后端获取到的ip地址都来自于nginx,用request.getremoteaddr();获取到的是nginx的ip地址,而不是用户的真实ip.
1.修改Nginx配置:
server {
listen 80;
server_name jenkins.local.com;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://192.168.10.204:8899;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
index index.html index.htm index.jsp index.action default.html;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}在原来的基础配置上加上后三行配置,就可以使用request.getHeader(“x-forwarded-for”)来获取用户真实的Ip地址了
2.java获取客户端Ip
package com.zimax.cqyf.admin.util;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* http工具类
*/
public class HttpUtils {
/**
* 获取真实的ip
* @param request
* @return
* @throws UnknownHostException
*/
public static String getRealIp(HttpServletRequest request)
{
String ip;
// 有的user可能使用代理,为处理用户使用代理的情况,使用x-forwarded-for
if (request.getHeader("x-forwarded-for") == null) {
ip = request.getRemoteAddr();
} else {
ip = request.getHeader("x-forwarded-for");
}
if ("127.0.0.1".equals(ip)) {
try {
// 获取本机真正的ip地址
ip = InetAddress.getLocalHost().getHostAddress();
}catch (Exception e){
e.printStackTrace();
}
}
return ip;
}
}附:一个ip工具类
import javax.servlet.http.HttpServletRequest;
/**
* IP地址工具类
* @author xudongdong
*
*/
public class IpUtil {
/**
* 私有化构造器
*/
private IpUtil() {
}
/**
* 获取真实IP地址
* 使用getRealIP代替该方法
* @param request req
* @return ip
*/
@Deprecated
public static String getClinetIpByReq(HttpServletRequest request) {
// 获取客户端ip地址
String clientIp = request.getHeader("x-forwarded-for");
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("WL-Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getRemoteAddr();
}
/*
* 对于获取到多ip的情况下,找到公网ip.
*/
String sIP = null;
if (clientIp != null && !clientIp.contains("unknown") && clientIp.indexOf(",") > 0) {
String[] ipsz = clientIp.split(",");
for (String anIpsz : ipsz) {
if (!isInnerIP(anIpsz.trim())) {
sIP = anIpsz.trim();
break;
}
}
/*
* 如果多ip都是内网ip,则取第一个ip.
*/
if (null == sIP) {
sIP = ipsz[0].trim();
}
clientIp = sIP;
}
if (clientIp != null && clientIp.contains("unknown")){
clientIp =clientIp.replaceAll("unknown,", "");
clientIp = clientIp.trim();
}
if ("".equals(clientIp) || null == clientIp){
clientIp = "127.0.0.1";
}
return clientIp;
}
/**
* 判断IP是否是内网地址
* @param ipAddress ip地址
* @return 是否是内网地址
*/
public static boolean isInnerIP(String ipAddress) {
boolean isInnerIp;
long ipNum = getIpNum(ipAddress);
/**
私有IP:A类 10.0.0.0-10.255.255.255
B类 172.16.0.0-172.31.255.255
C类 192.168.0.0-192.168.255.255
当然,还有127这个网段是环回地址
**/
long aBegin = getIpNum("10.0.0.0");
long aEnd = getIpNum("10.255.255.255");
long bBegin = getIpNum("172.16.0.0");
long bEnd = getIpNum("172.31.255.255");
long cBegin = getIpNum("192.168.0.0");
long cEnd = getIpNum("192.168.255.255");
isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd)
|| ipAddress.equals("127.0.0.1");
return isInnerIp;
}
private static long getIpNum(String ipAddress) {
String[] ip = ipAddress.split("\\.");
long a = Integer.parseInt(ip[0]);
long b = Integer.parseInt(ip[1]);
long c = Integer.parseInt(ip[2]);
long d = Integer.parseInt(ip[3]);
return a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
}
private static boolean isInner(long userIp, long begin, long end) {
return (userIp >= begin) && (userIp <= end);
}
public static String getRealIP(HttpServletRequest request){
// 获取客户端ip地址
String clientIp = request.getHeader("x-forwarded-for");
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getRemoteAddr();
}
String[] clientIps = clientIp.split(",");
if(clientIps.length <= 1) return clientIp.trim();
// 判断是否来自CDN
if(isComefromCDN(request)){
if(clientIps.length>=2) return clientIps[clientIps.length-2].trim();
}
return clientIps[clientIps.length-1].trim();
}
private static boolean isComefromCDN(HttpServletRequest request) {
String host = request.getHeader("host");
return host.contains("www.189.cn") ||host.contains("shouji.189.cn") || host.contains(
"image2.chinatelecom-ec.com") || host.contains(
"image1.chinatelecom-ec.com");
}
}
# nginx
# 内网
# 客户端
# 的是
# 都是
# 第一个
# 来自于
# 本机
# 就可以
# 而不是
# 判断是否
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速重置建站主机并恢复默认配置?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
晋江文学城电脑版官网 晋江文学城网页版直接进入
黑客如何通过漏洞一步步攻陷网站服务器?
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何快速建站并高效导出源代码?
焦点电影公司作品,电影焦点结局是什么?
iOS中将个别页面强制横屏其他页面竖屏
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
利用vue写todolist单页应用
Laravel如何集成Inertia.js与Vue/React?(安装配置)
浅述节点的创建及常见功能的实现
Laravel如何使用Service Container和依赖注入?(代码示例)
如何利用DOS批处理实现定时关机操作详解
Windows Hello人脸识别突然无法使用
如何在阿里云部署织梦网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
轻松掌握MySQL函数中的last_insert_id()
JavaScript数据类型有哪些_如何准确判断一个变量的类型
如何在新浪SAE免费搭建个人博客?
如何安全更换建站之星模板并保留数据?
Laravel观察者模式如何使用_Laravel Model Observer配置
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
原生JS获取元素集合的子元素宽度实例
Laravel如何优化应用性能?(缓存和优化命令)
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何在IIS中新建站点并解决端口绑定冲突?
JavaScript常见的五种数组去重的方式
Laravel如何使用Eloquent进行子查询
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
如何在阿里云购买域名并搭建网站?
如何有效防御Web建站篡改攻击?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
bing浏览器学术搜索入口_bing学术文献检索地址
如何快速搭建高效简练网站?
实例解析Array和String方法
Laravel怎么为数据库表字段添加索引以优化查询
Laravel PHP版本要求一览_Laravel各版本环境要求对照
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
Thinkphp 中 distinct 的用法解析
如何用AWS免费套餐快速搭建高效网站?
Laravel如何实现API速率限制?(Rate Limiting教程)
Laravel如何使用模型观察者?(Observer代码示例)
如何在阿里云ECS服务器部署织梦CMS网站?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
javascript基本数据类型及类型检测常用方法小结
在线制作视频网站免费,都有哪些好的动漫网站?


{
String ip;
// 有的user可能使用代理,为处理用户使用代理的情况,使用x-forwarded-for
if (request.getHeader("x-forwarded-for") == null) {
ip = request.getRemoteAddr();
} else {
ip = request.getHeader("x-forwarded-for");
}
if ("127.0.0.1".equals(ip)) {
try {
// 获取本机真正的ip地址
ip = InetAddress.getLocalHost().getHostAddress();
}catch (Exception e){
e.printStackTrace();
}
}
return ip;
}
}