EndpointConfig端点配置类使用

EndpointConfig 是Spring WebSocket框架中的一个接口,用于配置WebSocket端点(Endpoint)。它提供了访问WebSocket端点配置信息的方法,这些信息在处理WebSocket连接时非常有用。以下是对 EndpointConfig 的详细介绍:

接口定义

EndpointConfig 接口位于 javax.websocket.server 包中,它是Java WebSocket API(JSR 356)的一部分。Spring WebSocket框架也提供了对这个接口的支持。

主要方法

  1. 返回一组类,这些类是在配置过程中传递给 EndpointConfig 的:Set<Class<?>> getClasses()

  2. 获取指定名称的初始化参数值:String getInitParam(String name)

  3. 获取所有的初始化参数:Map<String, String> getInitParams()

  4. 获取与当前WebSocket连接关联的用户主体(Principal):Principal getUserPrincipal()

  5. 检查当前用户是否具有指定的角色:boolean isUserInRole(String role)

  6. 获取路径参数的映射:Map<String, String> getPathParameters()

  7. 获取解码器列表:List<Class<? extends Decoder>> getDecoders()

  8. 获取编码器列表:List<Class<? extends Encoder>> getEncoders()

使用场景

  1. 初始化参数配置

    在配置中设置一些初始化参数,并在 Endpoint 中通过 EndpointConfig 访问这些参数。

  2. 用户认证和授权

    通过 getUserPrincipal()isUserInRole() 方法,你可以在连接建立时检查用户的身份和角色。

  3. 路径参数

    如果你的WebSocket端点URL中有路径参数,可以通过 getPathParameters() 方法获取这些参数。

  4. 编解码器

    配置自定义的编解码器,并在 Endpoint 中通过 getDecoders()getEncoders() 方法访问它们。

示例代码

如何在 Endpoint 中使用 EndpointConfig

java 复制代码
// 自定义配置器
public class ChatEndpointConfigurator extends ServerEndpointConfig.Configurator {

    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        // 设置初始化参数
        sec.getUserProperties().put("myInitParam", "Hello, World!");

        // 设置路径参数
        Map<String, List<String>> pathParams = request.getUri().getQueryParameters();
        sec.getUserProperties().put("userId", pathParams.getFirst("userId"));

        // 设置用户主体
        Principal userPrincipal = new Principal() {
            @Override
            public String getName() {
                return "user123";
            }
        };
        sec.getUserProperties().put("javax.websocket.endpoint.principal", userPrincipal);
    }
}


@ServerEndpoint(value = "/chat", configurator = ChatEndpointConfigurator.class)
public class ChatEndpoint {

    @OnOpen
    public void onOpen(Session session, EndpointConfig config) {
        // 获取初始化参数
        String initParam = config.getInitParam("myInitParam");
        System.out.println("Init Param: " + initParam);

        // 获取路径参数
        Map<String, String> pathParams = config.getPathParameters();
        String userId = pathParams.get("userId");
        System.out.println("User ID: " + userId);

        // 获取用户主体
        Principal userPrincipal = config.getUserPrincipal();
        if (userPrincipal != null) {
            System.out.println("User Principal: " + userPrincipal.getName());
        }

        // 检查用户角色
        boolean isAdmin = config.isUserInRole("admin");
        System.out.println("Is Admin: " + isAdmin);
    }
}

完整WebSocket使用demo

WebSocket简易聊天室实现(有详细解释)-CSDN博客

相关推荐
吠品15 小时前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器
亚历克斯神16 小时前
智能搜索系统的升级复盘——从 Elasticsearch 到混合检索的检索质量提升
java·spring·微服务
金銀銅鐵17 小时前
[Java] 一个方法最多可以有多少个入参?
java·jvm
哭哭啼17 小时前
JAVA服务问题诊断
java·开发语言·jvm
Sayuanni%318 小时前
SpringBoot 从注解到源码:核心知识点总结
java·spring boot·后端
坚定信念,勇往无前18 小时前
Maven 私有仓库-nexus
java
Minner-Scrapy18 小时前
Scrapy 2.17 源码解析:Scheduler 调度器与磁盘/内存双队列
java·爬虫·python·scrapy·网络爬虫·twisted
晚风醉蝶18 小时前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
夏天拐跑了西瓜19 小时前
Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战
java·spring cloud·微服务
2601_9672642819 小时前
Jetpack Compose 实践指南:从入门到进阶
java·学习