当前位置: 首页 > news >正文

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 地址是非常重要的,它可以帮助我们做出更好的决策和实现更高级的功能。希望本文对您有所帮助,并能在实际的开发中提供一些指导和参考。

相关文章:

Java WebSocket 获取客户端 IP 地址

在开发 Web 应用程序时&#xff0c;我们通常需要获取客户端的 IP 地址用于日志记录、身份验证、限制访问等操作。当使用 WebSocket 协议时&#xff0c;我们可以使用 Java WebSocket API 来获取客户端的 IP 地址。 本文将介绍如何使用 Java WebSocket API 获取客户端 IP 地址&a…...

【HarmonyOS】低代码平台组件拖拽使用技巧之页签容器

【关键字】 HarmonyOS、低代码平台、Tabs、TabContent、页签导航 1、写在前面 前面几篇分别介绍了低代码平台中的堆叠容器、滚动容器、网格布局等三种容器的使用&#xff0c;实际开发中我们经常会有这样的需求&#xff0c;页面底部是三个Tab按钮点击时会分别切换不同的视图内…...

Linux fork和vfork函数用法

fork和vfork是用于创建新进程的函数&#xff0c;在Linux的C语言编程中非常常见。 fork函数 fork函数是用于创建一个新的进程&#xff0c;新进程是调用进程的副本。新进程将包含调用进程的地址空间、文件描述符、栈和数据。在fork之后&#xff0c;父进程和子进程将并发执行。 …...

Oracle Data Redaction和Oracle Data Pump

本实验的使用环境基于之前的博客&#xff1a;一个简单的Oracle Redaction实验 本实验参考文档为15.14 Oracle Data Redaction and Oracle Data Pump 先创建directory并赋权&#xff1a; -- connect to database or pluggable database alter session set containerorclpdb1;…...

python django 小程序图书借阅源码

开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

CI/CD --git版本控制系统

目录 一、git简介 二、git使用 三、github远程代码仓库 一、git简介 Git特点&#xff1a; 速度简单的设计对非线性开发模式的强力支持&#xff08;允许成千上万个并行开发的分支&#xff09;完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目&#xff08;速度和数…...

CSS中2种复合选择器

1:交集选择器 作用&#xff1a;选中同时符合多个条件的元素 语法&#xff1a;选择器1选择器2选择器n{} 注意&#xff1a;若交集选择器中有元素选择器&#xff0c;必须使用元素选择器开头 2:并集选择器 作用&#xff1a;同时选择多个选择器对应的元素 语法&#xff1a;选择…...

【Skynet 入门实战练习】开发环境搭建 | 运行第一个项目 | debug console 简单使用

文章目录 写在前面开发环境搭建skynet配置文件项目&#xff0c;启动&#xff01; debug console 写在前面 本系列【Skynet 入门实战练习】所有源码同步&#xff1a;https://gitee.com/Cauchy_AQ/skynet_practice 开发环境搭建 skynet skynet 框架地址&#xff1a;https://g…...

【探索嵌入式虚拟化技术与应用】— 虚拟化技术深入浅出自学系列

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:【探索嵌入式虚拟化技术与应用】&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 一、虚拟技术的发展历史 1.1传统技术的局限性&#xff1a; ​编辑 1.2云计算和万物互联技术的发展机遇&#x…...

MIB 6.1810实验Xv6 and Unix utilities(5)find

难度:moderate Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution should be in the file user/find.c. 题目要求&#xff1a;实现find &#xff0c;即在某个路径中&#xff0c;找出某…...

百度爬虫的工作原理解析

百度作为中国最大的搜索引擎&#xff0c;其工作原理备受关注。本文将深入探讨百度爬虫的工作原理&#xff0c;介绍其基本流程以及关键技术&#xff0c;帮助读者更好地理解搜索引擎背后的技术核心。 百度爬虫是百度搜索引擎的重要基石&#xff0c;它们被广泛用于收集互联网上的网…...

Linux入门必备指令

Linux学习之路起始篇——Linux基本指令 文章目录 Linux学习之路起始篇——Linux基本指令**一、ls指令****二、pwd命令****三、cd命令****四、touch指令****五、mkdir命令****六、rm命令****七、man 命令****八、cp命令****九、mv命令****10、cat 指令****十一、tac命令** 前言&…...

linux系统环境下mysql安装和基本命令学习

此篇文章为蓝桥云课--MySQL的学习记录 块引用部分为自己的实验部分&#xff0c;其余部分是课程自带的知识&#xff0c;链接如下&#xff1a; MySQL 基础课程_MySQL - 蓝桥云课 本课程为 SQL 基本语法及 MySQL 基本操作的实验&#xff0c;理论内容较少&#xff0c;动手实践多&am…...

Monitor 原理

每个 Java 对象都可以关联一个 Monitor 对象&#xff0c;如果使用 synchronized 给对象上锁&#xff08;重量级&#xff09;之后&#xff0c;该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。 Monitor组成内容 EntryList&#xff08;入口列表&#xff09; 当一个线…...

Java核心知识点整理大全7-笔记

目录 4.1.9. JAVA 锁 4.1.9.1. 乐观锁 4.1.9.2. 悲观锁 4.1.9.3. 自旋锁 4.1.9.4. Synchronized 同步锁 Synchronized 作用范围 Synchronized 核心组件 Synchronized 实现 4.1.9.5. ReentrantLock Lock 接口的主要方法 非公平锁 公平锁 ReentrantLock 与 synchronized …...

Flink Operator 使用指南 之 全局配置

背景 在上一个章节中已经介绍了基本的Flink-Operator安装,但是在实际的数据中台的项目中,用户可能希望看到Flink Operator的运行日志情况,当然这可以通过修改Flink-Operator POD的文件实现卷挂载的形势将日志输出到宿主机器的指定目录下,但是这种办法对数据中台的产品不是…...

手把手教你通过CODESYS V3进行PLC编程(一)

教程背景 宏集MC系列模块化控制器是基于Raspberry Pi的高性能4核控制器&#xff0c;运动控制循环时间最快可达500微秒&#xff0c;实现了计算能力和成本之间的最佳平衡&#xff0c;适用于多轴运动控制和CNC控制。 教程目的 本系列教程将使用宏集MC系列控制器&#xff0c;详细…...

《算法通关村—进制转换问题处理模板》

《算法通关村—进制转换问题处理模板》 先来一个题热热身 504. 七进制数 给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 示例 1: 输入: num 100 输出: "202"示例 2: 输入: num -7 输出: "-10"提示&#xff1a; …...

python接口自动化测试之接口数据依赖

一般在做自动化测试时&#xff0c;经常会对一整套业务流程进行一组接口上的测试&#xff0c;这时候接口之间经常会有数据依赖&#xff0c;那又该如何继续呢&#xff1f; 那么有如下思路&#xff1a; 抽取之前接口的返回值存储到全局变量字典中。初始化接口请求时&#xff0c;…...

s28.CentOS、Ubuntu、Rocky Linux系统初始化脚本v6版本

CentOS、Ubuntu、Rocky系统初始化脚本 Shell脚本源码地址&#xff1a; Gitee&#xff1a;https://gitee.com/raymond9/shell Github&#xff1a;https://github.com/raymond999999/shell 可以去上面的Gitee或Github仓库代码拉取脚本。 版本功能v6版更新内容1.由于CentOS 6…...

YAPI MCP PRO:基于MCP协议将YApi无缝集成AI代码编辑器的实践指南

1. 项目概述与核心价值如果你和我一样&#xff0c;每天都要在YApi里翻找接口文档、复制粘贴路径和参数&#xff0c;然后切回代码编辑器去写调用逻辑&#xff0c;那这个循环一定让你感到疲惫。更别提当后端同事更新了接口&#xff0c;你还在用旧参数调试的尴尬场景。YAPI MCP PR…...

大容量互连系统在自动化测试中的高效应用与设计要点

1. 大容量互连系统在自动化测试中的核心价值在半导体封装测试车间里&#xff0c;我看到过这样一个场景&#xff1a;技术员需要为每个待测芯片手工连接78根测试探针&#xff0c;平均每次换型耗时23分钟。而隔壁产线采用大容量互连系统后&#xff0c;同样的操作仅需7秒——这正是…...

GitHub代码搜索实战:精准挖掘AI编程助手配置文件与最佳实践

1. 为什么你需要这份AI助手配置搜索指南如果你正在使用Claude Code、Cursor、Windsurf或者GitHub Copilot这类AI编程助手&#xff0c;并且已经不止一次地对着空白的配置文件发呆&#xff0c;思考着“别人到底是怎么配置这玩意的&#xff1f;”&#xff0c;那么这份指南就是为你…...

医疗AI跨学科协作:从数据科学到临床实践的全流程实践指南

1. 项目概述&#xff1a;当数据科学家遇上临床医生“跨学科医疗AI团队协作”&#xff0c;这个标题听起来既宏大又充满挑战。作为一个在医疗数据科学领域摸爬滚打了近十年的从业者&#xff0c;我深知这短短几个字背后&#xff0c;是无数个通宵达旦的会议、反复修改的模型、以及因…...

集成学习与可解释AI在医疗影像诊断中的应用:以脑肿瘤检测为例

1. 项目概述&#xff1a;当AI诊断脑肿瘤时&#xff0c;我们如何看清它的“思考”过程&#xff1f;在医疗影像诊断领域&#xff0c;尤其是脑肿瘤的早期筛查与识别&#xff0c;人工智能&#xff08;AI&#xff09;模型&#xff0c;特别是深度卷积神经网络&#xff08;CNN&#xf…...

航空发动机齿轮有限元可靠性分析与齿廓修形优化【附仿真】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;多保真度主动学习代理模型与模型修正&#xff1a; …...

CANN/metadef自定义逻辑流分配函数

CustomAllocateStreamPassFn 【免费下载链接】metadef Ascend Metadata Definition 项目地址: https://gitcode.com/cann/metadef AI处理器支持情况 AI处理器类型 是否支持 Ascend 910C√ Ascend 910B√ 功能说明 注册自定义的逻辑流分配Pass执行函数。 函数原型 P…...

AI跨学科扩散62年文献计量分析:从计算机科学到生物医学、社会科学的融合路径与未来趋势

1. 项目概述&#xff1a;从海量文献中洞察AI的融合之路最近几年&#xff0c;AI&#xff08;人工智能&#xff09;这个词几乎无处不在&#xff0c;从写代码到画图&#xff0c;从自动驾驶到药物研发&#xff0c;它像水银泻地一样渗透进各个角落。但你是否想过&#xff0c;这种“渗…...

SD-WebUI-Inpaint-Anything:智能图像修复的终极指南

SD-WebUI-Inpaint-Anything&#xff1a;智能图像修复的终极指南 【免费下载链接】sd-webui-inpaint-anything Inpaint Anything extension performs stable diffusion inpainting on a browser UI using masks from Segment Anything. 项目地址: https://gitcode.com/gh_mirr…...

Python声明式数据抓取:openclaw-py工具库的设计理念与实战应用

1. 项目概述与核心价值 最近在折腾一些自动化脚本和数据处理任务时&#xff0c;我常常遇到一个痛点&#xff1a;需要从各种网页、文档或者API接口里精准地“抓取”特定格式的数据&#xff0c;比如表格、列表&#xff0c;或者嵌套在复杂HTML结构里的信息。手动写正则表达式或者用…...