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

Springboot websocket前端无法访问到,Websocket因AOP代理 前端无法请求到

Springboot websocket前端无法访问到,Websocket因AOP代理 前端无法请求到

问题出现

在我后端springboot启动后,前端无法请求websocket请求连接到我们websocket服务器。

想要的效果

在我后端springboot启动后,前端可以请求到我们websocket服务器,并且进行交互。

问题排查

出现的问题A

出现问题的代码:

package com.gsxy.core.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config){
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry){
        registry.addEndpoint("/ws").withSockJS();
    }

}

问题出在没有告诉spring遇见wensocket协议该如何处理。

改正后的代码:

package com.gsxy.core.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
@EnableWebSocket
public class WebSocketConfig  {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

出现的的问题B

问题出在Websocket在controller包下,在我们aop SystemAopImpl,对我们的contorller包下进行了所有代码增强。

/**
 * @author zhuxinyu 2023-10-23
 */
@Component
@Aspect
public class SystemAopImpl implements SystemAop {
    /**
     * @author zhuxinyu 2023-10-23
     * 清理ThreadLocal 防止内存泄漏
     * @param joinpoint
     * @throws Exception
     */
    @Override
    @After("execution(* com.gsxy.core.controller.*.*(..))")
    public void removeAllThreadLocal(JoinPoint joinpoint) throws Exception {
        ThreadLocalUtil.mapThreadLocalOfJWT.remove();
        ThreadLocalUtil.mapThreadLocal.remove();
        ThreadLocalUtil.DataOfThreadLocal.remove();

    }

}

​ 因为在Spring AOP中使用的是IOC 和 AOP动态代理创建对象,在WebSocket中,如果代理类被代理了,可能会出现问题因为WebSocket容器会查找类上的注解,但是无法找到代理类上,因为@ServerEndpoint来自Java标准注解,并不是AOP,如果我们使用的是cglib动态代理技术,执行的是目标类的子类,这个字类包含我们的拦截逻辑和目标方法的引用,所以无法读取到websocket的注解,导致无法访问websocket,因为我们的websocket没有实现接口,默认实现的cglib动态代理技术,所以触犯了这个问题。jdk动态代理,他执行的是代理对象,这个代理类是包含了我们的环绕逻辑和我们目标类的代理对象,所以不会导致注解失效。

总结

使用websocket不能被cglib所代理。

必须告诉spring遇见websocket如何解决

http://www.dtcms.com/a/4601.html

相关文章:

  • 五种多目标优化算法(MOJS、NSGA3、MOGWO、NSWOA、MOPSO)求解微电网多目标优化调度(MATLAB代码)
  • Tomcat实现WebSocket即时通讯 Java实现WebSocket的两种方式
  • GEE:梯度提升树(Gradient Boosting Tree)分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)
  • letcode::数组中的第k个最大元素
  • 软件设计先进性之虚拟化技术的应用
  • 三、Keil安装芯片包、下载固件库、建立STM32工程模板
  • Ceres使用
  • 数据结构总复习
  • Github Copilot AI编码完成工具
  • 【限时免费】20天拿下华为OD笔试之【双指针】2023Q1A-两数之和绝对值最小【欧弟算法】全网注释最详细分类最全的华为OD真题题解
  • 逻辑回归
  • 激光塑料透光率检测仪进行材料质量监控
  • 【数据库篇】关系模式的表示——(1)问题的提出
  • 目标检测 详解SSD原理,数据处理与复现
  • SparkSession介绍
  • mysql 性能参数调优详解
  • 随便问问webtab的记录(1)
  • HTML网站稳定性状态监控平台源码
  • Log4j2.xml不生效:WARN StatusLogger Multiple logging implementations found:
  • 【C++初阶】STL详解(五)List的介绍与使用
  • Java核心知识点整理大全9-笔记
  • 【计算机网络】(网络层)定长掩码和变长掩码
  • 华为云cce健康检查有什么用?配置需要注意什么?
  • Spark的通用运行流程与Spark YARN Cluster 模式的运行流程
  • Vue使用基本教程(基本介绍及对比,初步使用,构建项目,编辑器等)
  • 探究Kafka原理-1.初识Kafka
  • AI原生应用为百度带来新增量
  • 如何使用Mondo Rescue备份及恢复Linux系统(制作ISO镜像,成功恢复)
  • Android扫码ZXing
  • msvcp71.dll,msvcr71.dll丢失怎么办?教你如何快速解决此问题