Java Spring MVC WebSocket 应用程序仅适用于本地应用程序服务器,但不适用于 openshift 主机

标签 java spring-mvc tomcat websocket openshift

我尝试做一个简单的 websocket 聊天,同样使用 Spring MVC。
源代码在我的存储库中可用 GitHub
它由以下部分组成:
欢迎 View 页面 index.jsp 包含用于输入用户昵称和密码并将其绑定(bind)到新用户实例的表单。

Welcome page

用户实例被传递给 Spring MVC Controller MainController.java。 Controller 创建链接到 chat.jsp 的新 ModelAndView 并将 User 实例传递给它,以便在标题和聊天窗口中显示用户的昵称。 chat.jsp 包含 js 代码,提供与 Chat.java 中的 websocket 端点的连接。它还将用户的昵称传递给端点以将其存储在其字符串字段中。
当我在本地 Tomcat 8 上试用它时,一切正常,正如预期的那样。

working chat

这是 websocket 端点连接的请求和响应。 enter image description here

但是当我在 OpenShift 的 Tomcat 7 远程主机上尝试它时它不起作用。
以下是屏幕截图:

enter image description here enter image description here

如您所见,用户的昵称未显示在 header 中,也未通过请求 URL 传递到端点。
似乎连User实例都没有从Spring MVC Controller 传递到chat.jsp View 页面。
有人可以解释一下我做错了什么吗?

最佳答案

我看到那里有两个问题:

  1. Ws 和 wss 端口 - use ports 8000 or 8443用于 OpenShift 上的网络套接字连接。我建议修改你的 chat.jsp :

    Chat.initialize = function () {
      if (window.location.protocol == 'http:') {
        Chat.connect('ws://' + window.location.host + ':8000/websocket/chat/${user.nickname}');
      } else {
        Chat.connect('wss://' + window.location.host + ':8443/websocket/chat/${user.nickname}');
      }
    };
    
  2. Tomcat 服务器版本。您可以使用 this quick-start在 OpenShift Online 上运行 Tomcat 8。然而,当我尝试使用快速入门时,我遇到了一些麻烦,所以我改变了一些东西并创建了一个 PR;在合并之前,您可以从 here 中获取适合我的版本.为了在小型 DIY 设备上部署 Tomcat 8,您可以使用此命令:rhc app create tomcat8 diy --from-code https://github.com/jiri-fiala/openshift-tomcat8-quickstart。将 tomcat8 替换为您想要的应用名称。请注意,下载和编译 Tomcat 8 需要几分钟时间。

随着 Tomcat 8 在 OpenShift 上运行,我将您的代码部署为 ROOT.war(我使用 mvn package 在本地创建了一个包),使用 Tomcat 的 Web 界面.测试聊天应用似乎还不错。

当然,这不是一个理想的部署; Web 应用程序以这种方式部署到数据目录。 OpenShift Online 目前不提供 Tomcat 8 卡带,您可以在其中将代码推送到存储库并自动构建和部署您的 Web 应用程序。

关于Java Spring MVC WebSocket 应用程序仅适用于本地应用程序服务器,但不适用于 openshift 主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37281463/

相关文章:

java - 是否可以在 Swing 上设置 TitledBorder 不透明?

java - Android 应用程序创建不在 Activity 中的内部文件

java - 错误代码 : 1046. 未选择数据库 通过在侧边栏的 SCHEMAS 列表中双击其名称来选择要使用的默认数据库

Java 下载大文件意外停止

java - super 开发模式 + Tomcat 中的 JSP 页面

Java ScrollPane(内部有 TextArea)无法以编程方式滚动到顶部

java - replaceAll 正则表达式排除某些事件

java - 如何在 SPRING DATA 中为单个方法将 FlushMode 设置为 COMMIT

java - 如何使该消息系统按预期工作

java - 如何在dao中使用jndi数据源?