【问题标题】:SpringMVC + Websocket + Chat Initial HttpHandshake FailingSpringMVC + Websocket + Chat 初始 Http 握手失败
【发布时间】:2014-03-14 18:09:10
【问题描述】:

我正在尝试在我现有的 Spring MVC 应用程序中实现聊天。我指的是来自 github 的这两个链接 -

  1. Spring STOMP

  2. Spring Websocket Portfolio

但是当我尝试通过 websocket 连接时,最初的 HttpHandhsake 似乎失败了。我已经在这里上传了我的源代码 - Server Code。 这里简要介绍一下源代码。 配置类是-

  1. ConChat 配置
  2. ConChactWebSocketConfig

只有 ChatController 处理 WebSocket 和 webapp/WEB-INF/pages/home.jsp 包含客户端 js。我使用 STOMP over Sock JS。

所以请查看代码并建议我进行更改以使聊天正常工作。目前,当我在网络选项卡上看到时,初始 HttpHandshake 似乎失败了,因为切换协议请求的延迟非常高(它永远不会返回)。

编辑 网络和控制台面板的屏幕截图 -

【问题讨论】:

    标签: java spring spring-mvc websocket spring-websocket


    【解决方案1】:

    您的链接代码相当大,因此很难确定所有事情发生的位置......但是当我让 WebSocket 的东西与 Spring 一起使用时,我必须处理一些事情:

    (顺便说一句,我最初遇到的问题与您的类似,初始握手会失败并显示各种错误消息)

    确保您使用的是最新的 Spring 4

    这些是我正在使用的特定 spring 依赖项。从您的 pom 看来,您在这里很好,但我将它们包括在列表中以供参考(这些是 Gradle 依赖项声明)。

    compile "org.springframework:spring-websocket:4.0.1.RELEASE"
    compile "org.springframework:spring-messaging:4.0.1.RELEASE"
    

    确保您使用的是 servlet 3.0 规范

    web.xml 应该将 servlet 规范版本声明为 3.0,而不是 2.3。看来您使用的是 2.3。

    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    

    不确定这是否是一项严格的要求,但我必须切换才能让我的工作。这是文档参考:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html。我还必须将“支持异步”元素添加到所有 servlet 定义和 filter 定义中:

    <async-supported>true</async-supported>
    

    另外,您需要使用兼容的 servlet 容器。我不得不升级到 Tomcat 7.0.50(我认为最低是 7.0.47)。 Spring 文档列出了其他兼容的容器。

    正确设置服务器

    这是我的 Spring XML 配置:

    <websocket:message-broker application-destination-prefix="/rt">
        <websocket:stomp-endpoint path="/endpoint" >
            <websocket:sockjs />
        </websocket:stomp-endpoint>
        <websocket:simple-broker prefix="/topic" />
    </websocket:message-broker>
    

    所以,我在端点“端点”上做了一个话题。 AFAICT 并没有真正使用“应用程序目标前缀”,因为我只是从服务器推送到客户端。

    然后,这不一定与您的“无法连接”问题相关,但这是我向主题发送消息的方式:

    SimpMessagingTemplate simpMessagingtemplate;
    @Autowired
    public void setSimpMessagingTemplate(SimpMessagingTemplate template){
        simpMessagingtemplate = template;
    }
    
    @Override
    public void sendMessage(UserDetails userDetails, String message, DateTime time) {
        // Send notifications based on subscriptions
        for(String destUser : ...list of users...){
            this.simpMessagingtemplate.convertAndSendToUser(
                destUser,
                "/topic/notifications", 
                new MessagePayload(... Your stuff here...));
        }
    }
    

    正确设置客户端的东西

    我正在使用 AngularJS,所以这些东西在消息服务中。

    var socket = new SockJS('https://localhost:8443/WildFire/endpoint');
    var stompClient  = Stomp.over(socket);
    
    stompClient.connect('empty', 'empty', function(frame){
        $log.info("Connected");
        stompClient.subscribe('/user/topic/notifications', function(message){
            addMessage(JSON.parse(message.body));
        });
    });
    

    我需要引用 websocket 的完整 URL,因为 SockJS 没有使用到端点的相对路径。在我做出改变之前,它导致了奇怪的错误。我正在进行用户特定的主题订阅,因此订阅声明中的“/user/...”。

    此外,我必须为初始 stompClient 连接提供虚拟凭据(例如“空/空”),否则我会收到关于缺少凭据的错误。我认为使用空字符串 ('','') 也可以。

    设置弹簧安全

    看起来在您的安全设置中,您的“/chat”网址属于“permitAll”条件。这不应该引起问题,但是您可以像保护任何其他 URL 一样保护 websocket 端点,因为它都是作为 Spring 处理的基本 servlet 请求开始的。

    我的安全配置将 websocket 端点处理为需要经过身份验证的会话和 HTTPS,这适用于 websocket 和消息传递系统。由于 websocket 连接以 servlet 请求开始,因此使用初始登录期间建立的 JSESSIONID 对其进行身份验证。

    无论如何,我不确定是什么导致了您的具体问题,但这是我为使我的应用程序正常工作所经历的过程。看起来你正在做的事情与我所做的非常相似,所以希望这能帮助你找出问题所在。

    【讨论】:

    • 谢谢老兄。这是一个非常好的答案,值得投票。我尝试了你提供的所有建议,但没有成功。我将用截图编辑我的问题,请有看看以获得更好的想法。另外我将尝试创建新的 MVC 项目,我刚开始认为也许我现有的 WebConfiguration 在配置 WebSocketConfiguration 时产生了问题。
    • 如果您查看网络面板,切换协议请求仍处于挂起状态。它回退并开始尝试使用其他协议,如 xhr_streaming 和 xhr,但它们也失败了。
    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 2020-09-14
    • 2011-04-07
    • 2014-01-04
    • 2023-03-05
    • 1970-01-01
    • 2021-11-13
    • 2018-11-26
    相关资源
    最近更新 更多