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

给网站划分栏目/云南最新消息

给网站划分栏目,云南最新消息,可以做网络攻防的实验的网站,wordpress有点尴尬诶该页无法显示后台抛出异常如下: Operator called default onErrorDropped reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: WebSocket close status code does NOT comply with RFC-6455: 1005 Caused by: java.lang.IllegalArgume…

后台抛出异常如下:

Operator called default onErrorDropped
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: WebSocket close status code does NOT comply with RFC-6455: 1005
Caused by: java.lang.IllegalArgumentException: WebSocket close status code does NOT comply with RFC-6455: 1005

分析原因是:

spring cloud gateway 转发websocket请求无法监听到 close 事件 没有收到预期的状态码

解决方案:

在gateway进行请求拦截

代码如下:

@Slf4j
@Component
public class CustomWebsocketRoutingFilter implements GlobalFilter, Ordered {//Sec-Websocket protocolpublic static final String SEC_WEBSOCKET_PROTOCOL = "Sec-WebSocket-Protocol";//Sec-Websocket headerpublic static final String SEC_WEBSOCKET_HEADER = "sec-websocket";//http header schemapublic static final String HEADER_UPGRADE_WebSocket = "websocket";public static final String HEADER_UPGRADE_HTTP = "http";public static final String HEADER_UPGRADE_HTTPS = "https";private final WebSocketClient webSocketClient;private final WebSocketService webSocketService;private final ObjectProvider<List<HttpHeadersFilter>> headersFiltersProvider;// 不直接使用 headersFilters 用该变量代替private volatile List<HttpHeadersFilter> headersFilters;public CustomWebsocketRoutingFilter(WebSocketClient webSocketClient, WebSocketService webSocketService, ObjectProvider<List<HttpHeadersFilter>> headersFiltersProvider) {this.webSocketClient = webSocketClient;this.webSocketService = webSocketService;this.headersFiltersProvider = headersFiltersProvider;}/* for testing *///http请求转为ws请求static String convertHttpToWs(String scheme) {scheme = scheme.toLowerCase();return "http".equals(scheme) ? "ws" : "https".equals(scheme) ? "wss" : scheme;}@Overridepublic int getOrder() {// Before NettyRoutingFilter since this routes certain http requests//修改了这里 之前是-1 降低优先级return Ordered.LOWEST_PRECEDENCE - 2;}@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {changeSchemeIfIsWebSocketUpgrade(exchange);URI requestUrl = exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);String scheme = requestUrl.getScheme();if (ServerWebExchangeUtils.isAlreadyRouted(exchange) || (!"ws".equals(scheme) && !"wss".equals(scheme))) {return chain.filter(exchange);}ServerWebExchangeUtils.setAlreadyRouted(exchange);HttpHeaders headers = exchange.getRequest().getHeaders();HttpHeaders filtered = HttpHeadersFilter.filterRequest(getHeadersFilters(), exchange);List<String> protocols = getProtocols(headers);return this.webSocketService.handleRequest(exchange, new ProxyWebSocketHandler(requestUrl, this.webSocketClient, filtered, protocols));}/* for testing *///获取请求头里的协议信息List<String> getProtocols(HttpHeaders headers) {List<String> protocols = headers.get(SEC_WEBSOCKET_PROTOCOL);if (protocols != null) {ArrayList<String> updatedProtocols = new ArrayList<>();for (int i = 0; i < protocols.size(); i++) {String protocol = protocols.get(i);updatedProtocols.addAll(Arrays.asList(StringUtils.tokenizeToStringArray(protocol, ",")));}protocols = updatedProtocols;}return protocols;}/* for testing */List<HttpHeadersFilter> getHeadersFilters() {if (this.headersFilters == null) {this.headersFilters = this.headersFiltersProvider.getIfAvailable(ArrayList::new);// remove host header unless specifically asked not tothis.headersFilters.add((headers, exchange) -> {HttpHeaders filtered = new HttpHeaders();filtered.addAll(headers);filtered.remove(HttpHeaders.HOST);boolean preserveHost = exchange.getAttributeOrDefault(ServerWebExchangeUtils.PRESERVE_HOST_HEADER_ATTRIBUTE, false);if (preserveHost) {String host = exchange.getRequest().getHeaders().getFirst(HttpHeaders.HOST);filtered.add(HttpHeaders.HOST, host);}return filtered;});this.headersFilters.add((headers, exchange) -> {HttpHeaders filtered = new HttpHeaders();for (Map.Entry<String, List<String>> entry : headers.entrySet()) {if (!entry.getKey().toLowerCase().startsWith(SEC_WEBSOCKET_HEADER)) {filtered.addAll(entry.getKey(), entry.getValue());}}return filtered;});}return this.headersFilters;}static void changeSchemeIfIsWebSocketUpgrade(ServerWebExchange exchange) {// 检查版本是否适合URI requestUrl = exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);String scheme = requestUrl.getScheme().toLowerCase();String upgrade = exchange.getRequest().getHeaders().getUpgrade();// change the scheme if the socket client send a "http" or "https"if (HEADER_UPGRADE_WebSocket.equalsIgnoreCase(upgrade) && (HEADER_UPGRADE_HTTP.equals(scheme) || HEADER_UPGRADE_HTTPS.equals(scheme))) {String wsScheme = convertHttpToWs(scheme);boolean encoded = ServerWebExchangeUtils.containsEncodedParts(requestUrl);URI wsRequestUrl = UriComponentsBuilder.fromUri(requestUrl).scheme(wsScheme).build(encoded).toUri();exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, wsRequestUrl);if (log.isTraceEnabled()) {log.trace("changeSchemeTo:[" + wsRequestUrl + "]");}}}//自定义websocket处理方式private static class ProxyWebSocketHandler implements WebSocketHandler {private final WebSocketClient client;private final URI url;private final HttpHeaders headers;private final List<String> subProtocols;ProxyWebSocketHandler(URI url, WebSocketClient client, HttpHeaders headers, List<String> protocols) {this.client = client;this.url = url;this.headers = headers;if (protocols != null) {this.subProtocols = protocols;} else {this.subProtocols = Collections.emptyList();}}@Overridepublic List<String> getSubProtocols() {return this.subProtocols;}@Overridepublic Mono<Void> handle(WebSocketSession session) {return this.client.execute(this.url, this.headers, new WebSocketHandler() {private CloseStatus adaptCloseStatus(CloseStatus closeStatus) {int code = closeStatus.getCode();if (code > 2999 && code < 5000) {return closeStatus;}switch (code) {case 1000://正常关闭return closeStatus;case 1001://服务器挂了或者页面跳转return closeStatus;case 1002://协议错误return closeStatus;case 1003://收到了不能处理的数据类型return closeStatus;case 1004:// 预留关闭状态码return CloseStatus.PROTOCOL_ERROR;case 1005:// 预留关闭状态码 期望收到状态码但是没有收到return CloseStatus.PROTOCOL_ERROR;case 1006:// 预留关闭状态码 连接异常关闭return CloseStatus.PROTOCOL_ERROR;case 1007://收到的数据与实际的消息类型不匹配return closeStatus;case 1008://收到不符合规则的消息return closeStatus;case 1009://收到太大的不能处理的消息return closeStatus;case 1010://client希望server提供多个扩展,server没有返回相应的扩展信息return closeStatus;case 1011://server遇到不能完成的请求return closeStatus;case 1012:// Not in RFC6455// return CloseStatus.SERVICE_RESTARTED;return CloseStatus.PROTOCOL_ERROR;case 1013:// Not in RFC6455// return CloseStatus.SERVICE_OVERLOAD;return CloseStatus.PROTOCOL_ERROR;case 1015:// 不能进行TLS握手 如:server证书不能验证return CloseStatus.PROTOCOL_ERROR;default:return CloseStatus.PROTOCOL_ERROR;}}/*** send      发送传出消息* receive   处理入站消息流* doOnNext  对每条消息做什么* zip       加入流* then      返回接收完成时完成的Mono<Void>*/@Overridepublic Mono<Void> handle(WebSocketSession proxySession) {Mono<Void> serverClose = proxySession.closeStatus().filter(__ -> session.isOpen()).map(this::adaptCloseStatus).flatMap(session::close);Mono<Void> proxyClose = session.closeStatus().filter(__ -> proxySession.isOpen()).map(this::adaptCloseStatus).flatMap(proxySession::close);// Use retain() for Reactor NettyMono<Void> proxySessionSend = proxySession.send(session.receive().doOnNext(WebSocketMessage::retain));Mono<Void> serverSessionSend = session.send(proxySession.receive().doOnNext(WebSocketMessage::retain));// Ensure closeStatus from one propagates to the otherMono.when(serverClose, proxyClose).subscribe();// Complete when both sessions are donereturn Mono.zip(proxySessionSend, serverSessionSend).then();}@Overridepublic List<String> getSubProtocols() {return CustomWebsocketRoutingFilter.ProxyWebSocketHandler.this.subProtocols;}});}}}

相关文章:

解决websocket不定时出现1005错误

后台抛出异常如下&#xff1a; Operator called default onErrorDropped reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: WebSocket close status code does NOT comply with RFC-6455: 1005 Caused by: java.lang.IllegalArgume…...

文章内容生成随机图像,并将这些图像上链

一、需求背景 在当前的互联网时代,信息越来越快速地传播,一篇好的文章不仅需要有吸引人的文字内容,还需要有精美的配图。但是,对于某些只有文字,而没有图片的文章,我们可以使用程序去生成随机的图片来作为文章的配图。 本文将详细介绍如何使用Java语言实现文章内容生成…...

l8-d9 UDP通信实现

一、函数接口扩展与UDP通信实现流程 1.write/read到send/recv 函数原型&#xff1a; ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags); 前三个参数同read/write一样&#xff1b; ssize_t rea…...

MongoDB复杂聚合查询与java中MongoTemplate的api对应

MongoDB聚合json脚本 db.getCollection("202303_refund").aggregate([{"$match": {"courseType": "常规班课","teacherRefundReasonCheck": true,"teacherId": {"$in": [7544]},"createTime"…...

WireShark抓包工具的安装

1.下载安装包 在官网或者电脑应用商城都可以下载 2.安装 打开安装包&#xff0c;点击next 点击next 选择UI界面&#xff0c;两种都装上 根据习惯选择 选择安装位置点击安装 开始安装安装成功...

审计智能合约的成本是多少?如何审计智能合约?

审计智能合约的成本是多少&#xff1f;如何审计智能合约&#xff1f; 智能合约安全审计在去中心化金融 (DeFi) 生态系统中非常普遍。如果您投资了一个区块链项目&#xff0c;您的决定可能部分基于智能合约代码审查的结果。 虽然大多数人都了解审计对网络安全的重要性&#xff…...

9.7 校招 内推 面经

绿泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | Momenta 2024校招火热进行中&#xff01;新增招聘岗位&#xff08;内推&#xff09; 校招 | Momenta 2024校招火热进行中&#xff01;新增招聘岗位&#xff08;内推&#xff09; 2、…...

【网络编程】IO多路复用

IO多路复用是一种高效的I/O处理方式&#xff0c;它允许单个进程能够同时监视多个文件描述符&#xff08;sockets、文件等&#xff09;&#xff0c;并在其中任何一个文件描述符准备好进行I/O操作时进行处理。它的核心在于使用少量的线程或进程来管理多个I/O操作&#xff0c;以提…...

MySQL与postgreSQL数据库的区别

MySQL 是一个流行的开源关系型数据库管理系统&#xff0c;具有以下优势&#xff1a; 开源和免费&#xff1a;MySQL 是一个开源软件&#xff0c;允许用户免费下载、使用和修改。它的免费版本&#xff08;Community Edition&#xff09;提供了广泛的功能&#xff0c;适用于大多数…...

单片机电子元器件-按键

电子元器件 按键上有 四个引脚 1 2 、 3 4 按下之后 导通 1 3 、 2 4 初始导通 通常按键开关为机械弹性开关&#xff0c;开关在闭合不会马上稳定的接通&#xff0c;会有一连串的抖动 抖动时间的长短有机械特性来决定的&#xff0c;一般为5ms 到10 ms 。 消抖的分类 硬件消…...

Nacos docker实现nacos高可用集群项目

目录 Nacos是什么&#xff1f; Nacos在公司里的运用是什么&#xff1f; 使用docker构建nacos容器高可用集群 实验规划图&#xff1a;​编辑 1、拉取nacos镜像 2、创建docker网桥&#xff08;实现集群内的机器的互联互通&#xff08;所有的nacos和mysql&#xff09;&#x…...

基于Dubbo实现服务的远程调用

目录 前言 RPC思想 为什么使用Dubbo Dubbo技术框架 ​编辑 调用关系流程 基础实现 A.提供统一业务Api B.编辑服务提供者Product B.a 添加依赖 B.b 添加Dubbo 配置(基于yaml配置文件) B.c 编写并暴露服务 C.编辑服务消费者 C.a 添加依赖 C.b 添加Dubbo配置 C.c 引用…...

Redis事务的理解

介绍 Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。 事务提供了一种将多个命令请求打包&#xff0c;然后一次性、按照顺序地执行多个命令的机制&#xff0c;并且在事务执行期间&#xff0c;服务器不会因为其他客户端请求而中断事务的执行功能&#xff0c;他会将事务中的…...

PostgreSQL安装异常,服务无法启动导致创建服务器超时

win上安装pg后无法创建服务器&#xff0c;提示创建超时&#xff0c;发现服务列表里面pg15服务 并没有启动&#xff0c;启动服务器发现服务不了&#xff0c;截图忘记截了&#xff0c;复现不了&#xff0c;解决方法是 换个身份&#xff0c;然后继续启动&#xff0c;然后就可以在…...

汽车电子系统网络安全解决方案

声明 本文是学习GB-T 38628-2020 信息安全技术 汽车电子系统网络安全指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 汽车电子系统网络安全范围 本标准给出了汽车电子系统网络安全活动框架&#xff0c;以及在此框架下的汽车电子系统网络安全活动…...

切片机制和MR工作机制

切片机制 默认的切片大小和块大小一致&#xff0c;切片的个数决定了MapTask的个数。 数据倾斜问题&#xff1a;如果某个切片的大小太小&#xff0c;会浪费了MapTask申请的CPU资源。 如果剩余数据长度大于128*1.1, 就切片成2份&#xff0c;否则就不进行切分了。 InputFormat基…...

【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路

postgresql 基础架构 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&…...

是的,决定放弃算法去机器学习了

可是梦想啊&#xff01;~她永存心间&#xff01;&#xff01;&#xff01; 我啊~本是执着于这些算法的怪咖&#xff0c;梦想是icpc&#xff0c;ccpc~ 可是啊~ 在以后的科研和工作中&#xff0c;这些算法很多都是用不到的&#xff0c;学习算法更重要的目的是锻炼编程能力和分析…...

Python 03(循环语句)

Python03&#xff08;循环语句&#xff09; 文章目录 Python03&#xff08;循环语句&#xff09;一、while语句二、while实现猜数字三、while循环的嵌套while循环嵌套实例需求&#xff1a; 四、for循环1、什么 是for循环2、语法3、执行流程4、for循环的基本使用5、range()函数6…...

安科瑞铁塔基站能耗监控解决方案

安科瑞 华楠 1 背景概述 5G发展&#xff0c;基站先行。5G基站的选址建设&#xff0c;是保证5G信号覆盖的基础&#xff0c;因此5G基站建设是5G产业布局的一部分&#xff0c;也是5G成熟的基础。 2G、3G、4G均是低频段信号传输&#xff0c;宏基站几乎能应付所有的信号覆盖。但由…...

操作系统-线程复用

操作系统执行线程复用的过程涉及到线程调度和管理。线程复用是指操作系统能够有效地重用现有的线程来执行新的任务&#xff0c;而不必每次都创建新线程。这有助于减少线程创建和销毁的开销&#xff0c;提高系统性能。下面是操作系统如何执行线程复用的关键步骤&#xff1a; 线程…...

通达信自定义副图行业指标K线指标 HYZS_QD

行业指数:HY_INDEXC,NODRAW; DRAWKLINE(HY_INDEXH,HY_INDEXO,HY_INDEXL,HY_INDEXC); MA5:MA(HY_INDEXC,5),COLORWHITE; {MA10:MA(HY_INDEXC,10),COLORYELLOW,LINETHICK2}; DRAWTEXT_FIX(1,1,1,1,STRCAT(STRCAT(CON2STR(HY_INDEXADV,0),/),STRCAT(CON2STR(HY_INDEXDEC,0), ))),…...

MDK-Keil AC6 Compiler屏蔽特定警告

最近在使用STM32CubeMX生成MDK工程是&#xff0c;使用了 AC6 版本的编译器进行编译代码&#xff0c;然后发现了一些警告&#xff0c;但是在 AC5 版本下编译又正常。于是研究了下怎么屏蔽特定的警告&#xff0c;这里记录一下。 1. Keil AC6屏蔽特定警告 遇到的警告如下&#x…...

计算机网络的故事——了解Web及网络基础

了解Web及网络基础 文章目录 了解Web及网络基础一、使用 HTTP 协议访问 Web二、HTTP 的诞生三、网络基础 TCP/IP四、与 HTTP 关系密切的协议 : IP、TCP 和 DNS 一、使用 HTTP 协议访问 Web 根据Web浏览器指定的URL&#xff0c;从对应的服务器中获取文件资源&#xff0c;从而显…...

[系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取详解

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…...

自动驾驶——估计预瞄轨迹YawRate

1.Introduction 在ADAS控制系统中&#xff0c;通常根据预瞄距离x去估计横向距离y&#xff0c;有如下关系&#xff1a; y a0 a1 x a2 * x^2 a3 * x^3 &#xff0c;那么现在有个需求&#xff0c;希望根据上述x和y的关系&#xff0c;去估计规划预瞄轨迹yawRate 2.How to es…...

PMP证书考下来要多少费用?

PMP考试共有三项费用&#xff1a;分为考前费用、考后费用和续证费用。 第一项是考前费用&#xff1a; 1、培训费用&#xff0c;在英文报名时需要填写培训公司名称和35学时的培训证明。一般的培训公司收费不一&#xff0c;有些公司大概是三千元左右&#xff0c;而有些公司可能…...

C动态分配

动态分布与静态发布&#xff1a; 静态分配 1、 在程序编译或运行过程中&#xff0c;按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区&#xff0c;一般以数组的形式。 4、 按计划分配。 动态分配 1、在程序运…...

C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)

了解程序环境和预处理 前言&#xff1a;一、程序环境二、编译链接2.1 翻译环境2.2 编译的几个阶段2.3 运行环境 三、预处理3.1 预定义符号3.2. #define的使用3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##的用途3.2.5 带副作用的宏参数3.2.6…...

Docker部署EMQX

1、简介 EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。 Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。 MQTT 是轻量的 (Lightweight)、发布订阅模式 (Pu…...