-
2018-12-24 09:07:20
HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
po.setIp(IpUtil.clientIp(req));
IpUtil.java
Java代码
- public class IpUtil {
- private static final Logger logger = LoggerFactory.getLogger(IpUtil.class);
- /**
- * 获取的是本地的IP地址
- *
- * @return
- */
- public static String serviceIp() {
- String result = "";
- try {
- InetAddress address = InetAddress.getLocalHost();
- result = address.getHostAddress();
- } catch (UnknownHostException e) {
- logger.error("------>调用 IpUtil.servicerIp,错误信息如下");
- logger.error(e.getMessage(), e);
- }
- return result;
- }
- /**
- * 获取的是该网站的ip地址,比如我们所有的请求都通过nginx的,所以这里获取到的其实是nginx服务器的IP地址
- *
- * @param domain
- * @return
- */
- public static String serviceIp(String domain) {
- String result = "";
- if (ValidatorUtil.isNotNullOrEmpty(domain)) {
- try {
- InetAddress inetAddress = InetAddress.getByName(domain);
- result = inetAddress.getHostAddress();
- } catch (UnknownHostException e) {
- logger.error("------>调用 IpUtil.servicerIp,错误信息如下");
- logger.error(e.getMessage(), e);
- }
- }
- return result;
- }
- /**
- * 根据主机名返回其可能的所有Ip地址
- *
- * @param domain
- * @return
- */
- public static List<String> originalServiceIp(String domain) {
- List<String> result = new ArrayList<>();
- if (ValidatorUtil.isNotNullOrEmpty(domain)) {
- try {
- InetAddress[] addresses = InetAddress.getAllByName(domain);
- for (InetAddress addr : addresses) {
- result.add(addr.getHostAddress());
- }
- } catch (UnknownHostException e) {
- logger.error("------>调用 IpUtil.originalServicerIp,错误信息如下");
- logger.error(e.getMessage(), e);
- }
- }
- return result;
- }
- /**
- * @param request
- * @return
- * @description: 如果通过了多级反向代理的话,
- * X-Forwarded-For的值并不止一个, 而是一串IP值,
- * 究竟哪个才是真正的用户端的真实IP呢?
- * 答案是取 X-Forwarded-For中第一个非unknown的有效IP字符串。
- */
- public static String clientIp(HttpServletRequest request) {
- String 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;
- }
更多相关内容 -
THinkPHP获取客户端IP与IP地址查询的方法
2020-12-19 17:51:40TP 中获取客户端IP地址的系统公共函数是:function get_client_ip()。返回值就是IP地址。 查询IP地址所在国家与地区的类文件是IpLocation.class.php,位于ThinkPHP\Lib\ORG\Net目录下。类名是IpLocation,方法是 ... -
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2020-12-10 23:55:08今天在搞JS(javascript)获取客户端IP的小程序,上网搜了下,好多在现在的系统和浏览器中的都无效,很无奈,在Chrome、FireFox中很少搞到直接利用ActiveX获取IP等的JS脚本。下面的代码是我在所有windowsNT5.0及以上... -
thinkphp如何获取客户端IP
2020-10-23 09:19:15主要介绍了thinkphp如何正确获取客户端IP,除了使用内置get_client_ip函数,还有没有其他方法?请阅读下文揭晓答案。 -
PHP 获取客户端真实IP地址多种方法小结
2020-12-18 04:10:16经过复杂的判断与算是的获取IP地址函数 复制代码 代码如下: function getIP() { if (getenv(‘HTTP_CLIENT_IP’)) { $ip = getenv(‘HTTP_CLIENT_IP’); } elseif (getenv(‘HTTP_X_FORWARDED_FOR’)) { $ip = ... -
php下获取客户端ip地址的函数
2020-12-17 22:02:45复制代码 代码如下:function getip() { $IP=getenv(‘REMOTE_ADDR’); $IP_ = getenv(‘HTTP_X_FORWARDED_FOR’); if (($IP_ != “”) && ($IP_ != “unknown”)) $IP=$IP_; return $IP; } 下面这个比较好的复制代码... -
java如何实现获取客户端ip地址?若不会,我便手把手教你【详细】
2022-03-30 22:13:02知道如何通过java获取客户端ip地址?若不会,我手把手教你,超级详细,相信我能把你教会。👨🎓作者:bug菌
💌公众号:猿圈奇妙屋
🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。
🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
一、前言🔥
环境:jdk1.8 + idea2019.3 + Windows10
二、摘要 🔥
项目开发中,在日常处理操作日志时,基本都会通过aop切面来实现用户操作日志的记录,但涉及到记录操作日志,想必肯定会有一项是基本都会参考记录的,那就是操作人的客户端ip地址,日后查"脏"也方便。
那么问题来了。具体怎么获取客户端的ip地址啊?哈哈哈,这就是我这期的教学内容,若是有的小伙伴知道怎么获取,那么我要表扬你,但是实现思路是否与我有同异?所以你也可以尝试看下bug菌是如何实现的吧。
接下来,我就开始教学啦,你们可得用心听。
三、java实现获取客户端ip 🔥
第一步:我们先来定义一个工具类,专门用于封装ip相关的方法类。
package com.example.review.util; import org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletRequest; /** * ip相关工具类 * * @Author luoYong * @Date 2022-03-30 17:16 */ public class IpUtils { }
第二步:也就是此期教学的核心所在了,那究竟怎么获取客户端ip呢?我也就不卖关子了。
通常获取客户端的IP地址都是通过 request.getRemoteAddr() ,对吧,但是你有想过么,如今基本系统都会进行域名代理等,比如通过 Apache,Squid 等反向代理软件,使用getRemoteAddr() 根本无法再获取到客户端的真实 IP 地址了。
为什么加了代理就获取不到了呢?这是因为在客户端和服务之间增加了中间代理,因此服务器是无法直接拿到客户端的 IP地址,服务器端应用也无法直接通过转发请求的地址返回给客户端,基本这种获取方式就直接被pass掉了。
如果还不理解,可以看下下边的代理流程示意图,你就会理解啦。
如果只局限系统不做代理,那肯定是ok的。那系统基本不可能不做代理的呀,所以咋办?别着急,我会告诉你怎么玩儿,如果使用了我的教学方法还获取不到,请你来揍我,好吧?
如下是具体获取客户端ip方法类:仅供大家参考。
/*** * 获取客户端ip地址 * @param request */ public static String getIP(final HttpServletRequest request) throws Exception { if (request == null) { throw (new Exception("getIpAddr method HttpServletRequest Object is null")); } String ipStr = request.getHeader("x-forwarded-for"); if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getRemoteAddr(); } // 多个路由时,取第一个非unknown的ip final String[] arr = ipStr.split(","); for (final String str : arr) { if (!"unknown".equalsIgnoreCase(str)) { ipStr = str; break; } } //目的是将localhost访问对应的ip 0:0:0:0:0:0:0:1 转成 127.0.0.1。 return ipStr.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipStr; }
需要注意的是,自己本地开发,基本都是通过使用 [ localhost ]标准主机名来进行接口访问的,对吧,那么你就会特别好奇,数据库记录日志 ip 这一栏,ip有的竟然是 0:0:0:0:0:0:0:1。
为什么获取到的ip是这样呢?这是因为 0:0:0:0:0:0:0:1 是[ ipv6 ]的表现形式,对应[ ipv4 ]来说相当于127.0.0.1,也就是本机。所以我在最后通过三目运算强行把ipv6地址转成了ipv4地址。这样讲大家可否能理解?不理解就回头好好恶补一下计算机网络,这也不是不可以。
如下分别是通过 localhost 及实际ip分别进行接口访问,数据库保存的操作日志记录。
附上获取本地ip数据库截图:
好啦,以上就是的通过java实现获取客户端ip的全部教学啦。如果对你有所帮助,还请不要忘记给bug菌[ 三连支持 ]哟。如果想获得更多的学习资源或者想和更多的技术爱好者一起交流,可以关注我的公众号『猿圈奇妙屋』,后台回复关键词领取学习资料、大厂面经、面试模板等海量资源,就等你来拿。
四、文末🔥
如果你还想要学习更多,小伙伴们大可关注bug菌专门为你们创建的专栏《java实战教学》,手把手教你如何玩转 java语言!我用双手成就你的梦想。
我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
最后送大家两句我很喜欢的话,与诸君共勉!
☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start。
🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。
💌如果文章对您有所帮助,就请留下您的赞吧!(#^.^#);
💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;
💗如果对文章有任何疑问,还请文末留言或者加群吧【QQ交流群:708072830】;
💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);
💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。
-
java获取客户端IP地址工具类
2021-11-01 15:19:15代码如下自取: import lombok.extern.slf4j.Slf4j; ... import java.net.InetAddress;... * @Title 获取客户端ip地址类 * @Author YangWanJie * @Date 2021/6/30 16:08 * @versioin V1.0 **/ @Slf代码如下自取:
import lombok.extern.slf4j.Slf4j; import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; /** * @Title 获取客户端ip地址类 * @Author YangWanJie * @Date 2021/6/30 16:08 * @versioin V1.0 **/ @Slf4j public class IpUtil { /** * @Title 获取用户IP地址 * 两种可能性 * 一:客户端未经过代理,直接访问服务器端; * 二:客户端通过多级代理,最终到达服务器端; * @Author YangWanJie * @Date 2020/1/20 10:57 * @versioin V1.0 **/ public static String getIp(HttpServletRequest request) { // 反向代理时获取真实ip String ip = request.getHeader("X-Forwarded-For"); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { // 多次反向代理后会有多个ip值,第一个ip才是真实ip if (ip.indexOf(",") > 0) { ip = ip.split(",")[0]; } } //Proxy-Client-IP/WL- Proxy-Client-IP :这个一般是经过apache http服务器的请求才会有,用apache http做代理时一般会加上Proxy-Client-IP请求头,而WL-Proxy-Client-IP是他的weblogic插件加上的头。 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.getHeader("HTTP_CLIENT_IP"); } //nginx代理一般会加上此请求头 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Real-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) { //根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); ip = inet.getHostAddress(); } catch (UnknownHostException e) { log.error("x-forwarded-for:{},Proxy-Client-IP:{},WL-Proxy-Client-IP:{},HTTP_CLIENT_IP:{},X-Real-IP:{},错误信息:{}", request.getHeader("X-Forwarded-For"), request.getHeader("Proxy-Client-IP"), request.getHeader("WL-Proxy-Client-IP"), request.getHeader("HTTP_CLIENT_IP"), request.getHeader("X-Real-IP"), e.getMessage()); } } } return ip; } }
-
如何在Java HttpServletRequest中获取客户端IP地址
2021-07-16 22:58:42I am trying to develop a Java web application (Servlet) which I need to get clients IP address.Please do not considers this as a duplicate question because I tried all the possible answers that are av...I am trying to develop a Java web application (Servlet) which I need to get clients IP address.
Please do not considers this as a duplicate question because I tried all the possible answers that are available in the stackoverflow.
Following is my code so far:
1)
String ipAddress = request.getRemoteAddr();
In this case most of the tome I get the 'Default gateway adress'(147.120.1.5). not my machine ip address(174.120.100.17).
2)
String ipAddress = request.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}
In this case most of the tome I get the 'Default gateway adress'(147.120.1.5). not my machine ip address(174.120.100.17).
3)
InetAddress IP=InetAddress.getLocalHost();
System.out.println(IP.getHostAddress());
In this case I got the server IP Address(147.120.20.1).
My IP address in 147.120.100.17.Now I don't know how to get the real client IP address. Please make an answer.
Thank you very much.
解决方案
Try this one,
String ipAddress = request.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}
-
获取客户端ip地址
2020-08-20 14:59:46一般的系统都会要求获取客户端登录... * 获取客户端ip地址 * @param request * @return */ protected String getIP(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip . -
【IP地址获取】java获取客户端ip地址
2018-08-31 16:44:38如何获取客户端ip和url访问中服务器端ip(如果是ip,不是域名)呢? String requestUrlIP = request.getServerName(); tring userIpAddr = request.getRemoteAddr(); System.out.println("***访问的Url中的... -
JAVA如何获取客户端IP地址和MAC地址
2020-12-20 09:47:26本文介绍了JAVA如何获取客户端IP...获取客户端IP地址public String getIp(HttpServletRequest request) throws Exception {String ip = request.getHeader("X-Forwarded-For");if (ip != null) {if (!ip.isEmpty() ... -
Spring MVC –如何获取客户端IP地址
2020-06-02 14:22:04在Spring框架中,您可以直接@Autowired在任何Spring托管Bean中直接使用HttpServletRequest ,然后再从请求标头中获取客户端的IP地址。 WebUtils.java package com.mkyong.web; import org.springframework.... -
如何在Java中获取客户端IP地址
2020-05-25 23:02:04在Java中,可以使用HttpServletRequest.getRemoteAddr()来获取正在访问Java Web应用程序的客户端的IP地址。 import javax.servlet.http.HttpServletRequest; String ipAddress = request.getRemoteAddr(); 1.... -
php获取客户端真实ip地址的三种方法
2021-03-22 23:24:50php获取用户(客户端)真实IP地址的两种方法第一种方法,还算靠谱,本人以前一直用的是这个方法:function get_real_ip(){$ip=false;if(!empty($_SERVER['HTTP_CLIENT_IP'])){$ip=$_SERVER['HTTP_CLIENT_IP'];}if(!... -
Http从request中获取客户端IP地址
2021-04-09 22:58:27因为想记录客户端请求的IP地址,故记录如下所示 一、实现方式 实现方式主要分为以下两步 获取HttpServletRequest 直接看代码即可,如下所示: ServletRequestAttributes attributes = (ServletRequestAttributes)... -
laravel获取客户端 IP 地址两种方式
2021-02-09 11:11:151 laravel自带方法获取客户端ip dd(request()->ip()); 2 自定义函数获取客户端IP <?php namespace App\Http\Controllers; class TestController extends Controller { public function ip() { dd($this... -
js获取客户端ip
2021-03-13 21:27:47js获取客户端ipjs获取客户端ip方法一:第三方接口方法二:利用WebRTC(Chrome/Firefox)方法三:求助后台大佬 js获取客户端ip 最近需要个需求,需要实现上次登录用户的IP及登录时间,如果两次登录ip不同,前端给出提示... -
JavaWeb获取客户端的IP地址与MAC地址总结
2020-02-06 21:28:09最近刚完成的一个模块中,需要获取系统客户端的IP地址与物理地址(MAC地址)。 获取的本机IP与MAC是服务器的,而非客户端的 通过JAVA获取,本机的IP地址与MAC地址,使用如下代码即可完成: package ... -
JS获取客户端IP地址、MAC和主机名的3个方法
2017-06-17 10:32:22这篇文章主要介绍了js获取客户端IP地址、MAC和主机名的7个方法汇总,JS本身是不支持获取IP地址等信息的,本文通过其它方法实现,需要的朋友可以参考下 今天在搞JS(JavaScript)获取客户端IP的小程序,上网搜了下... -
PHP获取客户端IP地址方式
2019-06-11 09:34:11REMOTE_ADDR = 客户端IP HTTP_X_FORWARDED_FOR = 没数值或不显示 $ip = $_SERVER['REMOTE_ADDR']; 二、使用透明代理 REMOTE_ADDR = 最后一个代理服务器 IP HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理... -
PHP 快速获取客户端IP地址及实际地址
2018-06-10 20:14:40PHP获取客户端IP,以下三种方法都可以获取IP地址 博客地址 Github function getip(){ if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "... -
Abp 框架获取客户端IP地址
2019-04-12 13:26:44发现网上很少有写Abp框架中如何获取客户端IP地址(非代理,这里只考虑普通情况) 由于Abp采用Ioc方式,我们只需要在需要的AppService类中的构造参数中加上IClientInfoProvider就可以使用了. namespace Demo { ... -
在ASP.NET Core 2.x中获取客户端IP地址
2020-03-07 08:35:00在ASP.NET中,可以通过以下方式获取客户端的IP地址。 HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 但这不适用于ASP.NET Core 2.0。我们需要一种不同的方法来检索HTTP请求信... -
在ASP.NET Core中获取客户端IP地址
2018-12-19 14:02:00随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址。WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求。 var ip = HttpContext.Current.Request.UserHostAddress; 或者只是直接引用当前的... -
socket编程之---------获取客户端主机名和IP地址
2021-02-28 08:54:57System.out.println(“Connection from==>” + addr.getHostName() + “/t” + addr.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } } } TCP客户端: package com.wodwl.example; import ... -
golang 获取客户端IP
2020-09-11 16:53:57// RemoteIp 返回远程客户端的 IP,如 192.168.1.1 func RemoteIp(req *http.Request) string { remoteAddr := req.RemoteAddr if ip := exnet.ClientPublicIP(req); ip != "" { remoteAddr = ip } else