ServerHttpRequest 和 HttpServletRequest 获取 IP 地址 学习笔记

最近在做一个请求白名单IP地址的功能;在拦截器 或者 service 层做校验判断,就用到了ServerHttpRequest 和 HttpServletRequest 获取 IP 地址的两种方式
做个记录笔记,如果有不对的地方可以直接私信我

代码

ServerHttpRequest 获取 IP 地址

这个是在拦截器里面用的,我本来是写到公用的的工具包里面的,但是运行会报错,把方法封装到拦截器里面运行又正常了;暂时没去看是什么原因,有知道的大佬,欢迎评论告知下

导包

import java.net.InetAddress;
import java.net.UnknownHostException;

代码

@Component
public class WhiteIpFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 请求ServerHttpRequest request = exchange.getRequest();// 获取 IP 地址String ip = getIP(request);log.info("========= 请求的IP地址: " + ip);return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}// 多次反向代理后会有多个ip值 的分割符private final static String IP_UTILS_FLAG = ",";// 未知IPprivate final static String UNKNOWN = "unknown";// 本地 IPprivate final static String LOCALHOST_IP = "0:0:0:0:0:0:0:1";private final static String LOCALHOST_IP1 = "127.0.0.1";private static String getIP(ServerHttpRequest request){// 根据 HttpHeaders 获取 请求 IP地址String ip = request.getHeaders().getFirst("X-Forwarded-For");if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeaders().getFirst("x-forwarded-for");if (ip != null && ip.length() != 0 && !UNKNOWN.equalsIgnoreCase(ip)) {// 多次反向代理后会有多个ip值,第一个ip才是真实ipif (ip.contains(IP_UTILS_FLAG)) {ip = ip.split(IP_UTILS_FLAG)[0];}}}if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeaders().getFirst("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeaders().getFirst("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeaders().getFirst("HTTP_CLIENT_IP");}if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeaders().getFirst("HTTP_X_FORWARDED_FOR");}if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeaders().getFirst("X-Real-IP");}//兼容k8s集群获取ipif (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getRemoteAddress().getAddress().getHostAddress();if (LOCALHOST_IP1.equalsIgnoreCase(ip) || LOCALHOST_IP.equalsIgnoreCase(ip)) {//根据网卡取本机配置的IPInetAddress iNet = null;try {iNet = InetAddress.getLocalHost();} catch (UnknownHostException e) {log.error("getClientIp error: ", e);}ip = iNet.getHostAddress();}}return ip;}
}
HttpServletRequest 获取 IP 地址
 private static final String IP_UTILS_FLAG = ",";private static final String UNKNOWN = "unknown";private static final String LOCALHOST_IP = "0:0:0:0:0:0:0:1";private static final String LOCALHOST_IP1 = "127.0.0.1";public static String getIpAddr(HttpServletRequest request) {String ip = null;try {//以下两个获取在k8s中,将真实的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。ip = request.getHeader("X-Original-Forwarded-For");if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader("X-Forwarded-For");}//获取nginx等代理的ipif (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader("x-forwarded-for");}if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_CLIENT_IP");}if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_X_FORWARDED_FOR");}//兼容k8s集群获取ipif (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();if (LOCALHOST_IP1.equalsIgnoreCase(ip) || LOCALHOST_IP.equalsIgnoreCase(ip)) {//根据网卡取本机配置的IPInetAddress iNet = null;try {iNet = InetAddress.getLocalHost();} catch (UnknownHostException e) {log.error("getClientIp error: ", e);}ip = iNet.getHostAddress();}}} catch (Exception e) {log.error("IPUtils ERROR ", e);}//使用代理,则获取第一个IP地址if (!StringUtils.isEmpty(ip) && ip.indexOf(IP_UTILS_FLAG) > 0) {ip = ip.substring(0, ip.indexOf(IP_UTILS_FLAG));}return ip;}`

ServerHttpRequest 和 HttpServletRequest 获取 IP 地址 学习笔记相关推荐

  1. k8s 查看ip地址属于哪个pod_Kubernetes Pod 如何获取 IP 地址

    [编者的话]在学习 Kubernetes 网络模型的过程中,了解各种网络组件的作用以及如何交互非常重要.本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod ...

  2. python地址多少位_Python获取IP地址对应的地理位置信息!

    在学习中有迷茫不知如何学习的朋友小编推荐一个学Python的学习q u n 227 -435- 450可以来了解一起进步一起学习!免费分享视频资料 原理简介 利用了三个可以查询ip地址对应归属地的网站 ...

  3. 自动ip的计算机共享打印,局域网内自动获取ip地址怎么设置打印机共享文件夹...

    在局域网环境中,为了尽可能地节省办公成本,很多用户都会选择在局域网中架设.部署共享打印机,以便在单位的任何角落处都能方便.自如地进行打印操作.下面是学习啦小编为大家整理的关于局域网内自动获取ip地址怎 ...

  4. 通过JAVA自动获取Ip地址

    今天给大家提供一款自动获取Ip地址的工具类 一般在做电商项目都会使用到这个功能,所以小冰今天就直接放到这里,方便后期使用 代码如下: package net.xdclass.xdvideo.utils ...

  5. java ip地址查询接口_java获取ip地址与网络接口的方法示例

    java获取ip地址与网络接口的方法示例 发布时间:2020-09-20 23:57:52 来源:脚本之家 阅读:66 作者:骏马金龙 java.net包 大家应该都知道,网络相关对象在java.ne ...

  6. java获取IP地址和MAC地址方式

    java获取IP地址和MAC地址方式 前端和后台都可以获取 ip获取方式比较简单,就不做分析了,主要说mac的获取 前端获取的方式与局限性:尝试好几种方式,这种是最易实现.最简单的方式,确实能获取该浏 ...

  7. Java 获取IP地址的工具类

    package cn.tolin.springboot.lab1.util;import javax.servlet.http.HttpServletRequest; import java.net. ...

  8. java获取ip地址以及获取浏览器信息工具

    /*** 获取ip地址*/public static String getIp(HttpServletRequest request) {String ipAddress = request.getH ...

  9. 如何通过一张照片来获取ip地址?

    在本教程中,我们将学习如何用一张照片来盗取ip地址.我的想法是通过修改.htaccess文件,将jpg文件当作php文件来解析. 下面就是我们需要向.htaccess中添加的代码: AddHandle ...

  10. linux设置成自动获取ip地址吗,centos怎么设置自动获取ip地址

    在适合Cable ip路由器环境下,centos可以设置成自动获取ip地址方式,下面是学习啦小编给大家整理的一些有关centos设置自动获取ip地址的方法,希望对大家有帮助! centos设置自动获取 ...

最新文章

  1. Alibaba 之 Nacos
  2. GAN眼中的图像翻译(附神奇歌单)
  3. Cissp-【第4章 通信与网络安全】-2021-3-12(377页-392页)
  4. 【乱侃】How do they look them ?
  5. 【阿里云 Linux 服务器】在阿里云购买的 Linux 或者 Windows 服务器,在用 putty 访问的时候不知道用户名密码怎么办?
  6. POJ 3608 旋转卡壳
  7. jquery地图插件jvectorMap
  8. vsftpd pam mysql_vsftpd+mysql+pam实现基于数据库的安全的ftp服务
  9. MyBatis框架学习笔记03:利用MyBatis实现关联查询
  10. 实现自己的脚本语言ngscript之三:语法设计
  11. 面试最后,HR 最后会说“我的问题问完了,你有什么要问我的吗?”如何理解和回答这句话?
  12. dropdownlist三级联动怎么实现_简单三步,轻松搞定一级、二级、三级下拉菜单
  13. 固态硬盘计算机怎么自定义分区,固态硬盘做系统分区教程-固态硬盘如何分区?...
  14. 易灵思FPGA-下载器选择指南
  15. 模拟模型学习----几何布朗运动模拟 与 基于扩散模拟
  16. 盘点IT职场“最差”程序员,这7个特征尤为典型!
  17. 华为MA5600配置radius认证登陆
  18. 组合数据类型(序列:列表)
  19. Github+Facebook=?这家公司有望让程序猿的头秃得慢一点
  20. python中字母大小顺序_Python中的字母顺序

热门文章

  1. 分页解决方案 之 分页算法——Pager_SQL的思路和使用方法
  2. 前端框架Bootstrap
  3. 一、基础篇--1.3进程和线程-CountDownLatch、CyclicBarrier 和 Semaphore
  4. Linux学习——操作文件与目录
  5. ActiveMQ 无法启动 提示端口被占用 解决方案
  6. Spring Boot和Dubbo整合
  7. ssh登录忽略known_hosts列表
  8. html入门的常见问题
  9. Linux下如何阅读开源项目
  10. 64位虚拟机Guest OS安装错误:0xC0000225