HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
po.setIp(IpUtil.clientIp(req));
IpUtil.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; }
<audio controls="controls" style="display: none;"></audio>
相关推荐
几天在用 spring-boot 2 的 webflux 重构一个工程,写到了一个需要获得客户端请求 IP 的地方,在写的过程中遇到很多问题,下面小编通过一段代码给大家介绍解决spring-boot2.0.6中webflux无法获得请求IP的问题,感...
32.3 CAS客户端的配置 244 32.3.1服务票据认证 244 32.3.2单一注销 246 32.3.3使用CAS认证无状态服务 249 配置CAS以获取代理授予票证 249 使用代理票证调用无状态服务 250 32.3.4代理票证认证 251 33. X.509认证 253...
3. 客户端准备:进入App.xaml.cs文件配置服务端的IP地址,同时在HttpUtil工具类中接入AI机器人接口、短信验证服务接口等,正确地配置SocketUtil中的连接。 运行说明 1. 打开软件后首先进入登录界面,如果已经完成...
文件传输系统主要功能是自动获取局域网内用户的主机名,IP地址以及工作组名字,最终以C/S模式通过TCP/IP协议实现点到点文件传输功能。本系统既锻炼了我们的实际动手能力,使我们将大学四年所学的理论知识与实际开发...
9.修复评论不记录客户端IP的问题 10.完全启动后5秒执行首页及栏目的静态文件生成、更新。 11.更换富文本编辑器。 12.发布文章的同时可以上传附件。 13.美化网站自动地图(导航)页。 14.更新了IP地址库(纯真)...
采用了时下最新的Spring Boot 2.2.5.RELEASE 、Spring Cloud Hoxton.SR4、 MyBatis3DynamicSql、Sharding-Jdbc、Redis、RabbitMq、ElasticSearch、Docker等流行技术,集成了Nacos注册中心/配置中心、Spring Cloud ...
有IP地址、用户名与密码等,可以下载一个FTP上传工具(cure)上传更新后的内容.可以在http://www.skycn.com/soft/683.html下载到. 下载以后,通过"站点管理"-->"新建站点".输入IP,用户名,密码.然后连接即可. 当然也...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...
3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换...