基于STOMP协议的WebSocket消息代理和相关的安全握手处理器以及消息拦截器

这篇具有很好参考价值的文章主要介绍了基于STOMP协议的WebSocket消息代理和相关的安全握手处理器以及消息拦截器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

package com.github.paicoding.forum.web.front.chat.stomp;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.server.HandshakeHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

/**
 * v1.1 stomp协议的websocket实现的chatgpt聊天方式
 *
 * @author YiHui
 * @date 2023/6/5
 */
@Slf4j
@Configuration
@EnableWebSocketMessageBroker // 开启websocket代理
public class WsChatConfig implements WebSocketMessageBrokerConfigurer {
    /**
     * 这里定义的是客户端接收服务端消息的相关信息,如派聪明的回答: WsAnswerHelper#response 就是往 "/chat/rsp" 发送消息
     * 对应的前端订阅的也是 chat/index.html: stompClient.subscribe(`/user/chat/rsp`, xxx)
     *
     * @param config
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        // 开启一个简单的基于内存的消息代理,前缀是/user的将消息会转发给消息代理 broker
        // 然后再由消息代理,将消息广播给当前连接的客户端
        config.enableSimpleBroker("/chat");

        // 表示配置一个或多个前缀,通过这些前缀过滤出需要被注解方法处理的消息。
        // 例如,前缀为 /app 的 destination 可以通过@MessageMapping注解的方法处理,
        // 而其他 destination (例如 /topic /queue)将被直接交给 broker 处理
        config.setApplicationDestinationPrefixes("/app");
    }


    /**
     * 添加一个服务端点,来接收客户端的连接
     * 即客户端创建ws时,指定的地址, chat/index.html: let socket = new WebSocket(`${protocol}//${host}/gpt/${session}/${aiType}`);
     * @param registry
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 注册一个 /gpt/{id} 的 WebSocket endPoint; 其中 {id} 用于让用户连接终端时都可以有自己的路径
        // 作为 Principal 的标识,以便实现向指定用户发送信息
        // sockjs 可以解决浏览器对 WebSocket 的兼容性问题,
        registry.addEndpoint("/gpt/{id}/{aiType}")
                .setHandshakeHandler(new AuthHandshakeHandler())
                .addInterceptors(new AuthHandshakeInterceptor())
                // 注意下面这个,不要使用 setAllowedOrigins("*"),使用之后有啥问题可以实操验证一下🐕
                // setAllowedOrigins接受一个字符串数组作为参数,每个元素代表一个允许访问的客户端地址,内部的值为具体的 "http://localhost:8080"
                // setAllowedOriginPatterns接受一个正则表达式数组作为参数,每个元素代表一个允许访问的客户端地址的模式, 内部值可以为正则,如 "*", "http://*:8080"
                .setAllowedOriginPatterns("*")
        ;
    }

    /**
     * 配置接收消息的拦截器
     *
     * @param registration
     */
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(channelInInterceptor());
    }

    /**
     * 配置返回消息的拦截器
     *
     * @param registration
     */
    @Override
    public void configureClientOutboundChannel(ChannelRegistration registration) {
        registration.interceptors(channelOutInterceptor());
    }

    @Bean
    public HandshakeHandler handshakeHandler() {
        return new AuthHandshakeHandler();
    }

    @Bean
    public HttpSessionHandshakeInterceptor handshakeInterceptor() {
        return new AuthHandshakeInterceptor();
    }

    @Bean
    public ChannelInterceptor channelInInterceptor() {
        return new AuthInChannelInterceptor();
    }

    @Bean
    public ChannelInterceptor channelOutInterceptor() {
        return new AuthOutChannelInterceptor();
    }
}

这段代码是一个Spring配置类WsChatConfig,基于STOMP协议的WebSocket消息代理和相关的安全握手处理器以及消息拦截器。这个类通过实现WebSocketMessageBrokerConfigurer接口来定义WebSocket通信的路由、安全握手以及消息拦截的逻辑。

核心方法详解

  1. configureMessageBroker(MessageBrokerRegistry config):

    • 此方法用于配置消息代理的行为。
    • enableSimpleBroker方法开启了一个基于内存的消息代理,所有以/chat为前缀的消息都会被转发到这个代理。
    • setApplicationDestinationPrefixes方法设置了应用前缀,这意味着所有以/app为前缀的目的地(destination)都可以通过注解方法进行处理。
  2. registerStompEndpoints(StompEndpointRegistry registry):

    • 此方法用于注册WebSocket端点,客户端将连接到这些端点。
    • addEndpoint方法注册了一个端点/gpt/{id}/{aiType},其中{id}{aiType}是路径变量,可以用于区分不同的用户和AI类型。
    • setHandshakeHandler方法设置了自定义的握手处理器AuthHandshakeHandler,用于在握手阶段进行安全验证。
    • addInterceptors方法添加了自定义的握手拦截器AuthHandshakeInterceptor,用于在握手过程中进行额外的处理。
    • setAllowedOriginPatterns方法设置了允许连接的客户端地址模式,这里使用了通配符*表示允许所有地址。
  3. configureClientInboundChannel(ChannelRegistration registration):

    • 此方法配置了客户端接收消息的通道,并设置了拦截器AuthInChannelInterceptor,用于在消息发送前进行权限验证。
  4. configureClientOutboundChannel(ChannelRegistration registration):

    • 此方法配置了客户端发送消息的通道,并设置了拦截器AuthOutChannelInterceptor,用于在消息接收后进行处理。
  5. handshakeHandler(), handshakeInterceptor(), channelInInterceptor(), channelOutInterceptor():

    • 这些方法分别创建了对应的Bean实例,它们在配置方法中被引用。

使用场景

WsChatConfig类适用于需要实现基于STOMP协议的WebSocket聊天应用的场景。它通过配置消息代理和安全握手处理器,确保了消息的安全传输和用户的认证。

注意事项

  • 配置中的setAllowedOriginPatterns("*")允许所有地址访问WebSocket端点,这在生产环境中是不推荐的,因为它可能导致安全风险。在生产环境中,应该将其替换为具体的客户端地址或者正则表达式模式。
  • 路径变量{id}{aiType}需要在握手处理器或拦截器中进行相应的处理,以确保消息可以正确地发送给指定的用户。
  • 拦截器的使用应该根据实际的安全需求进行定制,例如,可以添加更多的权限验证逻辑来保护WebSocket通信。
  • 配置类中的@Bean注解方法使得Spring容器能够管理这些处理器和拦截器的生命周期,确保它们在应用启动时被正确初始化。

WsChatConfig类为基于STOMP协议的WebSocket聊天应用提供了一个全面的配置方案,包括消息代理的设置、安全握手的处理以及消息的拦截和验证。文章来源地址https://www.toymoban.com/news/detail-858268.html

到了这里,关于基于STOMP协议的WebSocket消息代理和相关的安全握手处理器以及消息拦截器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot + WebSocket+STOMP指定推送消息

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 本文将简单的描述SpringBoot + WebSocket+STOMP指定推送消息场景,不包含信息安全加密等,请勿用在生产环境。 JDK:11+ Maven: 3.5+ SpringBoot: 2.6+ stompjs@7.0.0 STOMP 是面向简

    2024年02月14日
    浏览(48)
  • HTTP、WebSocket、STOMP、MQTT 协议

    TCP/IP 是用于因特网 (Internet) 的通信协议,是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。 TCP/IP是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合,是一个协议族。 1-1、TCP(传输控制协议,Transmission Control Protocol) 在计算机网

    2024年04月15日
    浏览(55)
  • flutter开发实战-长链接WebSocket使用stomp协议stomp_dart_client

    flutter开发实战-长链接WebSocket使用stomp协议stomp_dart_client 在app中经常会使用长连接进行消息通信,这里记录一下基于websocket使用stomp协议的使用。 1.1 stomp介绍 stomp,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件

    2024年02月13日
    浏览(48)
  • Springboot 整合 WebSocket ,使用STOMP协议 ,前后端整合实战 (一)(1)

    server: port: 9908 3.WebSocketConfig.java 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.springfra

    2024年04月25日
    浏览(45)
  • Springboot 整合 WebSocket ,使用STOMP协议+Redis 解决负载场景问题

    ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(om); template.setValueSerializer(jacksonSeial); template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template

    2024年04月14日
    浏览(54)
  • 基于SockJS+Stomp的WebSocket实现

    前言     之前做个一个功能,通过websocket长链接接收后台推送的数据,然后在前端动态渲染。一直没来的及输出个文档,现在输出一下。 WebSocket介绍     WebSocket 是一种在 Web 应用中实现实时通信的方法,它可以在客户端和服务器端之间建立长连接,实现实时消息传递。  

    2024年02月12日
    浏览(37)
  • java实现websocket握手协议

    其中最重要的是最后几个换行不要丢,将字符串转成byte[]写给客户端即可 收到的掩码转换 下面是服务器向客户端发送消息

    2024年02月08日
    浏览(41)
  • SSL握手协议相关概念

     下图为握手协议的流程图,具体的解释参考博客: 【下】安全HTTPS-全面详解对称加密,非对称加密,数字签名,数字证书和HTTPS_tenfyguo的博客-CSDN博客  下面梳理一下SSL协议中的一些细节。首先是相关名词:证书、签名、非对称加密、预主秘钥。 非对称加密是一类加密算法

    2024年02月13日
    浏览(34)
  • nginx代理websocket相关配置

    map $http_upgrade $connection_upgrade {         default upgrade;         \\\'\\\' close; } # 转发ws location ^~ /ws {        # 后台准备的websocket地址端口        proxy_pass http://localhost:9092;        # 其他参数都一样        proxy_read_timeout 300s;        proxy_send_timeout 300s;        proxy_set_header  Host $

    2024年02月13日
    浏览(40)
  • 【网络安全 | 网络协议】结合Wireshark讲解TCP三次握手

    TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。在建立 TCP 连接时,需要进行三次握手,防止因为网络延迟、拥塞等原因导致的数据丢失或错误传输,确保双方都能够正常通信。 TCP三次握手在Wireshark数据包中是如何体现的?在此之前,先熟悉TCP三次握手的流程。

    2024年02月03日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包