Java WebSocket 获取客户端 IP 地址

在开发 Web 应用程序时,我们通常需要获取客户端的 IP 地址用于日志记录、身份验证、限制访问等操作。当使用 WebSocket 协议时,我们可以使用 Java WebSocket API 来获取客户端的 IP 地址。

本文将介绍如何使用 Java WebSocket API 获取客户端 IP 地址,以及如何在常见的 WebSocket 框架中获得客户端 IP 地址。

Java WebSocket API 获取客户端 IP 地址

Java WebSocket API 是 Java EE 的一部分,提供了一套用于开发 WebSocket 服务器的 API。通过 Java WebSocket API,我们可以编写自己的 WebSocket 服务器,处理客户端的连接、消息和关闭事件。

在 Java WebSocket API 中,我们可以通过 Session 对象获取客户端的 IP 地址。Session 对象代表了客户端与服务器建立的 WebSocket 连接。

下面是一个使用 Java WebSocket API 获取客户端 IP 地址的示例代码:

@ServerEndpoint("/websocket")
public class WebSocketServer {@OnOpenpublic void onOpen(Session session, EndpointConfig config) {String clientIp = getClientIpAddress(session);System.out.println("New connection from IP: " + clientIp);}@OnMessagepublic void onMessage(String message, Session session) {// 处理收到的消息}@OnClosepublic void onClose(Session session, CloseReason closeReason) {String clientIp = getClientIpAddress(session);System.out.println("Connection closed from IP: " + clientIp);}private String getClientIpAddress(Session session) {String ipAddress = null;MessageContext messageContext = session.getUserProperties().get("javax.websocket.server.ServerEndpointConfig.MESSAGE_CONTEXT")if (messageContext != null) {HttpServletRequest request = (HttpServletRequest) messageContext.get(ServletRequest.class.getName());if (request != null) {ipAddress = request.getRemoteAddr();}}return ipAddress;}
}

在上述代码中,@ServerEndpoint("/websocket") 注解用于标记该类是一个 WebSocket 服务器端点。通过 onOpen 方法,我们可以在建立连接时获取到客户端的 IP 地址,并进行相应的处理。同样地,在 onClose 方法中,我们也可以获取客户端 IP 地址并处理连接关闭事件。

getClientIpAddress 方法中,我们通过 session.getUserProperties() 获取到用户属性的 Map,从中取出 MESSAGE_CONTEXT,然后获取到 ServletRequest 对象。通过 HttpServletRequestgetRemoteAddr 方法,我们可以得到客户端的 IP 地址。

常见 WebSocket 框架获取客户端 IP 地址

除了使用 Java WebSocket API,我们还可以在一些常见的 WebSocket 框架中获取客户端的 IP 地址。下面将介绍几个常用的 WebSocket 框架以及如何在这些框架中获取客户端 IP 地址。

Spring WebSocket

Spring WebSocket 是 Spring 框架提供的 WebSocket 支持。在 Spring WebSocket 中,我们可以通过 WebSocketSession 对象获取客户端的 IP 地址。

下面是一个在 Spring WebSocket 中获取客户端 IP 地址的示例代码:

@Controller
public class WebSocketController extends TextWebSocketHandler {@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {String clientIp = getClientIpAddress(session);System.out.println("New connection from IP: " + clientIp);}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {// 处理收到的消息}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {String clientIp = getClientIpAddress(session);System.out.println("Connection closed from IP: " + clientIp);}private String getClientIpAddress(WebSocketSession session) {String ipAddress = null;HttpSession httpSession = (HttpSession) session.getAttributes().get("HTTP_SESSION");if (httpSession != null) {ipAddress = httpSession.getServletContext().getRealPath();}return ipAddress;}
}

在上述代码中,WebSocketSession 类似于 Java WebSocket API 中的 Session 对象。通过 WebSocketSessiongetAttributes 方法,我们可以获取到传递给 WebSocket 的属性。在这里,我们获取到了 HTTP_SESSION 属性,也就是底层的 HttpSession 对象。通过 HttpSession 对象,我们可以使用 getServletContext().getRealPath() 方法来获取客户端的 IP 地址。

Netty WebSocket

Netty 是一个异步事件驱动的网络应用程序框架,它也提供了 WebSocket 的支持。在 Netty WebSocket 中,我们可以通过 ChannelHandlerContext 对象获取客户端的 IP 地址。

下面是一个在 Netty WebSocket 中获取客户端 IP 地址的示例代码:

@ChannelHandler.Sharable
public class WebSocketHandler extends SimpleChannelInboundHandler<WebSocketFrame> {@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {SocketAddress socketAddress = ctx.channel().remoteAddress();if (socketAddress instanceof InetSocketAddress) {InetSocketAddress inetSocketAddress = (InetSocketAddress) socketAddress;String clientIp = inetSocketAddress.getAddress().getHostAddress();System.out.println("New connection from IP: " + clientIp);}}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {// 处理收到的消息}@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {SocketAddress socketAddress = ctx.channel().remoteAddress();if (socketAddress instanceof InetSocketAddress) {InetSocketAddress inetSocketAddress = (InetSocketAddress) socketAddress;String clientIp = inetSocketAddress.getAddress().getHostAddress();System.out.println("Connection closed from IP: " + clientIp);}}
}

在上述代码中,channelActive 方法在客户端建立连接时被调用,我们可以通过 ChannelHandlerContext 中的 remoteAddress 获取客户端的 IP 地址。同样地,channelInactive 方法在连接关闭时被调用,我们也可以在这里获取客户端 IP 地址并进行相应的处理。
以下是一个基本的Java学习大纲,可用于初学者的学习路线。根据您的学习进度和需求,您可以自行调整和扩展。

第一阶段:基础概念

  1. 理解编程的基本概念
  2. 学习计算机科学基础知识,如数据类型、变量、常量等
  3. 掌握基本的控制流程,如条件语句、循环语句等
  4. 学习面向对象编程概念,如类、对象、封装、继承和多态
  5. 学习基本的数据结构和算法知识,如数组、链表、栈和队列
  6. 理解异常处理机制和错误处理方法
  7. 学习基本的输入输出操作和文件处理

第二阶段:核心Java知识

  1. 学习Java语言的核心特性,如包、接口、枚举等
  2. 学习Java集合框架,如List、Set、Map等
  3. 掌握泛型编程和类型擦除的概念
  4. 学习多线程编程,如线程创建、同步和通信等
  5. 学习反射机制和动态代理模式
  6. 掌握异常处理和自定义异常类
  7. 学习文件操作和流处理

第三阶段:高级Java技术

  1. 学习网络编程基础,如Socket编程、HTTP和TCP/IP协议等
  2. 掌握Java数据库编程,如连接数据库、执行SQL语句等
  3. 学习Java GUI编程,如Swing和JavaFX框架
  4. 了解Web开发基础,如Servlet、JSP和Java Web框架(如SpringMVC)
  5. 学习使用Java开发常见的应用程序,如图像处理、数据分析等
  6. 学习常用的开发工具和集成开发环境(IDE),如Eclipse和IntelliJ IDEA

第四阶段:实战项目

  1. 开展自己的Java项目,如学生管理系统、图书馆管理系统等
  2. 学习使用版本控制系统,如Git或SVN,进行团队合作开发
  3. 掌握调试技巧和解决bug的方法
  4. 学习编写高质量的代码,包括代码风格、注释和文档编写等
  5. 参与开源项目或实习,获得实际项目经验
  6. 不断学习和练习,掌握更多的Java知识和技能

通过按照这个学习大纲来学习Java,您将能够逐步掌握Java语言的基础和核心知识,并能够应用于实际的开发项目中。记住要不断练习和实践,参与开源社区和项目,以增强自己的技能和经验。

总结

本文介绍了如何使用 Java WebSocket API 和常见的 WebSocket 框架获取客户端的 IP 地址。通过 Java WebSocket API,我们可以在建立连接和关闭连接时获取客户端 IP 地址,通过一些框架提供的接口,我们可以在相应的事件中获取客户端 IP 地址,并做出相应的处理。

在开发 WebSocket 应用程序时,了解如何获取客户端的 IP 地址是非常重要的,它可以帮助我们做出更好的决策和实现更高级的功能。希望本文对您有所帮助,并能在实际的开发中提供一些指导和参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

substring-after用法

substring-after&#xff1a;函数返回一个字符串&#xff0c;该字符串是给定子字符串后给定字符串的其余部分。 #句法 substring-after( haystack ,needle) haystack&#xff1a;要评估的字符串。该字符串的一部分将被返回。 needle&#xff1a;要搜索的子字符串。needle在h…

SqlServer_idea连接问题

问题描述&#xff1a; sqlServer安装之后可以使用navicat进行连接idea使用账户密码进行登录连接失败 问题解决&#xff1a; 先使用sqlServer管理工具进行登录 使用window认证连接修改账户密码 启用该登录名 这时idea还是无法连接&#xff0c;还需要如下配置 打开sqlserve…

获取所有非manager的员工emp_no

个人网站 文章首发于公众号小肖学数据分析 题目来自牛客网 描述 有一个员工表employees简况如下: emp_nobirth_datefirst_namelast_namegenderhire_date100011953-09-02GeorgiFacelloM1986-06-26100021964-06-02BezalelSimmelF1985-11-21100031959-12-03PartoBamfordM1986…

centos安装指定版本docker

centos7安装指定版本的docker 官方文档 https://docs.docker.com/engine/install/centos/ 1、卸载旧版本 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、设…

140.【鸿蒙OS开发-01】

鸿蒙开发 (一)、初识鸿蒙1.初识鸿蒙(1).移动通讯技术的发展(2).完整的鸿蒙开发 (二)、鸿蒙系统介绍1.鸿蒙系统的官方定义(1).鸿蒙操作系统概述(2).鸿蒙的生态 2.鸿蒙系统的特点3.鸿蒙和安卓的对比4.鸿蒙开发的发展前景 (三)、鸿蒙开发准备工作1.鸿蒙OS的完整开发流程2.注册并实…

哈希表HashTable

散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。 哈希表中关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff0c;复杂度O(1) 哈希表本质…

css设置下划线

css中设置下划线的方法 在CSS中可以使用text-decoration属性或border-bottom属性来给字体设置下划线样式。 1、使用text-decoration:underline;设置下划线样式 CSS的text-decoration属性用于指定添加到文本的修饰&#xff0c;其underline属性值可以定义文本下的一条线。 语…

渗透测试--4.捕获和监听数据

捕获和监听数据 一. 捕获和监听数据1.监听捕获数据方法2.kali监听捕获工具介绍arpspoof使用 arpspoof 工具需要满足以下条件:在 Kali Linux 上,arpspoof 工具是通过 dsniff 软件包提供的。arpspoof实战(同一局域网断网实战)arpspoof实战(流量传输的功能)driftnet参数形式…

计算机类编程课学生编写的代码应该如何管理

管理学生编写的代码是一个重要的任务&#xff0c;以下是几种常见的方式来有效地管理学生的代码&#xff1a; 版本控制系统&#xff1a;使用版本控制系统&#xff08;如Git&#xff09;来管理学生的代码。每个学生都可以在自己的分支上进行开发&#xff0c;并通过提交请求&#…

BellmanFord算法

算法 Bellman-Ford(G, w, s)for each vertex v 属于 V[G]d[v] 无穷大p[v] NILd[s] 0for i 1 to |V[G]| - 1relax(u, v, w)for each edge(u, v)属于E[G]if d[v] > d[u] w(u, v)return falsereturn truen表示图中的顶点数&#xff0c;m表示边数&#xff0c;时间复杂度为…

Idea2023 Springboot web项目正常启动,页面展示404解决办法

Idea2023 Springboot web项目正常启动,页面展示404解决办法 问题&#xff1a; 项目启动成功&#xff0c;但是访问网页&#xff0c;提示一直提示重定向次数过多&#xff0c;404 解决方法 在IDEA的Run/Debug Configurations窗口下当前的Application模块的Working directory中添…

centos更换yum源

1. 安装wget yum install -y wget 2. 备份配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 3. 下载华为yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo 4. 清…

Induced AI:一个专门为自动化任务而设计的AI原生浏览器RPA平台

​内容来源&#xff1a;xiaohuggg Induced AI&#xff1a;一个专门为自动化任务而设计的AI原生浏览器RPA平台 刚刚获得OpenAI CEOsama的个人投资&#xff01; 它能够模拟人类浏览网页的行为&#xff0c;自动化地浏览网页&#xff0c;搜集关键信息&#xff0c;并对这些信息进行…

JS-项目实战-新增水果库存功能实现

1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name); //返回的是NodeList类型}} }//当…

浅谈电动汽车充电桩设计与应用研究

安科瑞 华楠 摘要&#xff1a;目前&#xff0c;随着我国社会经济的快速发展&#xff0c;我国的各个领域都取得了突破性的发展&#xff0c;尤其是在电动汽车充电桩的设计方法&#xff0c;新型的电动汽车充电桩设计已经广泛的受到了人民群众的青睐与认可&#xff0c;而这种发展前…

SQL sever2008数据库备份、还原以及库检查

目录 一、数据库备份 法一:SSMS工具 法二: Transact-SQL (T-SQL) 命令 二、数据库还原 法一:SSMS工具 法二: Transact-SQL (T-SQL) 命令 三、数据库检查 1. 确认数据库状态: 2. 验证还原完成的数据: 3. 检查日志和错误信息: 方法 1:使用 SQL Server Managem…

【网络编程】简述TCP通信程序,三次握手,四次挥手

文章目录 &#x1f384;TCP通信程序⭐打印字符串✨中文乱码问题&#x1f388;解决方法 &#x1f33a;TCP三次握手&#x1f33a;TCP四次挥手&#x1f6f8;其他 &#x1f38a;专栏【网络编程】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386…

快速解密PPT幻灯片密码,让PPT重见天日

最简单的办法解密、找回和去除PPT幻灯片密码&#xff0c;具体步骤如下&#xff1a;1.百度搜索【密码帝官网】&#xff0c;2.点击“立即开始”在用户中心上传要解密的文件稍等片刻&#xff0c;就能找回密码。不用下载软件&#xff0c;手机电脑都可用。而且还支持Word、Excel、PD…

VC++添加包含目录

安装了QT;它带有很多例子; 新建一个工程,添加一个C++源文件,随便拷个例子的源码过来; 然后VS会提示头2个include语句出错; 因为找不到这两个头文件;这需要添加包含目录; 进入项目属性页;VC++目录 - 包含目录,它之前有2个系统的值;点击右侧的下拉箭头按钮,点…

C# 依赖注入如何实现

在 C# 中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;是一种编程技术&#xff0c;用于减少代码之间的耦合。依赖注入可以通过构造函数注入、属性注入或方法注入实现。在 .NET Core 和 .NET 5 中&#xff0c;还提供了一个内置的依赖注…