错误"忽略消息,没有可用的主要信息"在春天使用websocket时

时间:2014-05-06 06:42:18

标签: spring websocket

在我的系统中,我使用自定义登录机制,因此tomcat和spring不知道经过身份验证的用户信息。当我订阅端点时:

stompClient.subscribe("/user/queue/position-updates", function(message) {...});

春天会抱怨“忽略消息,没有可用的主要信息”。我追溯到代码,并发现spring将尝试从DefaultUserDestinationResolver类中的会话中获取原则信息,但是不会获取任何内容,因此会给出错误消息。

我的问题是:     弹簧websocket是否依赖于tomcat或spring的安全机制?     我可以手动将经过身份验证的用户信息设置为http会话原理吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

WebSocketSession中的用户来自会话开始时的HttpServletRequest.getUserPrincipal()(即握手请求)。您可以包装HTTP请求(例如,从过滤器中)并覆盖返回用户的方法,也可以扩展DefaultHandshakeHandler(请参阅determineUser protected方法)。 Java和XML配置都提供了一种配置自定义HandshakeHandler的方法。

答案 1 :(得分:0)

你可以像这样实现HandshakeHandler。

        $cars = $this->car->find('all', array(
        'conditions' => array(
            'car.id' => array(3, 10, 7)
        ),
        'limit' => 3, 
        'order' => array('car.id' => 'desc')
    ));

}

然后在你的xml中声明它。

public class HandshakeHandler extends DefaultHandshakeHandler {
Logger logger = (Logger) LoggerFactory.getLogger(HandshakeHandler.class);
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String, Object> attributes) {
    Principal principal = request.getPrincipal();

    if(principal==null)
    {
        ServletServerHttpRequest req= (ServletServerHttpRequest)request;
        HttpSession session = req.getServletRequest().getSession();
        final User user = (User) session.getAttribute("user");
        principal=new Principal() {
            @Override
            public String getName() {
                return user!=null?user.getId():"";
            }
        };
    }
    logger.debug("principal:{}",principal);
    return principal;
}