EndpointConfig
是Spring WebSocket框架中的一个接口,用于配置WebSocket端点(Endpoint)。它提供了访问WebSocket端点配置信息的方法,这些信息在处理WebSocket连接时非常有用。以下是对 EndpointConfig
的详细介绍:
接口定义
EndpointConfig
接口位于 javax.websocket.server
包中,它是Java WebSocket API(JSR 356)的一部分。Spring WebSocket框架也提供了对这个接口的支持。
主要方法
-
返回一组类,这些类是在配置过程中传递给
EndpointConfig
的:Set<Class<?>> getClasses()
-
获取指定名称的初始化参数值:
String getInitParam(String name)
-
获取所有的初始化参数:
Map<String, String> getInitParams()
-
获取与当前WebSocket连接关联的用户主体(Principal):
Principal getUserPrincipal()
-
检查当前用户是否具有指定的角色:
boolean isUserInRole(String role)
-
获取路径参数的映射:
Map<String, String> getPathParameters()
-
获取解码器列表:
List<Class<? extends Decoder>> getDecoders()
-
获取编码器列表:
List<Class<? extends Encoder>> getEncoders()
使用场景
-
初始化参数配置
在配置中设置一些初始化参数,并在
Endpoint
中通过EndpointConfig
访问这些参数。 -
用户认证和授权
通过
getUserPrincipal()
和isUserInRole()
方法,你可以在连接建立时检查用户的身份和角色。 -
路径参数
如果你的WebSocket端点URL中有路径参数,可以通过
getPathParameters()
方法获取这些参数。 -
编解码器
配置自定义的编解码器,并在
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