2018年3月6日 新增完成开发说明,移步:http://blog.csdn.net/lnktoking/article/details/78678406
后台代码配置:
/**
* WebSocket配置
* @author lnkToKing
*/
@Configuration
/*
* 开启使用STOMP协议来传输基于代理(message broker)的消息
* 启用后控制器支持作用@MessgeMapping注解
*/
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Value("${token-secret-key}")
private String tokenSecretKey;
//注册STOMP协议节点并映射url
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
//添加连接节点
registry.addEndpoint("/endpoint").addInterceptors(new HandshakeInterceptor() {
/**
* websocket握手
*/
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
ServletServerHttpRequest req = (ServletServerHttpRequest) request;
//获取token认证
String token = req.getServletRequest().getParameter("token");
//解析token获取用户信息
Principal user = parseToken(token);
if(user == null){ //如果token认证失败user为null,返回false拒绝握手
return false;
}
//保存认证用户
attributes.put("user", user);
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
}
}).setHandshakeHandler(new DefaultHandshakeHandler(){
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String, Object> attributes) {
//设置认证用户
return (Principal)attributes.get("user");
}
})
.setAllowedOrigins("*") //允许跨域
.withSockJS(); //指定使用SockJS协议
}
/**
* 根据token认证授权
* @param token
*/
private Principal parseToken(String token){
//TODO 解析token并获取认证用户信息
return null;
}
}
前端js连接
var sock = new SockJS('http://localhost:8080/endpoint?token=access_token'); //连接节点
var stomp = Stomp.over(sock);
stomp.connect({}, function(frame){ //连接成功后订阅消息接口
//订阅消息
});