当前位置: 首页 > 知识库问答 >
问题:

如何在Spring MVC中代理/镜像Websocket连接url?

苏墨竹
2023-03-14

我几乎已经完成了如何将服务器端闪亮的应用程序嵌入到JSP页面中而不在其他地方公开应用程序,但这个解决方案的最后一部分真的让我卡住了。

(基本背景:这是一个Spring MVC Java webserver,与一个闪亮的应用程序在同一台机器上。如果可能的话,我希望避免使用Spring Boot。)

private static final RestTemplate restTemplate = new RestTemplate(
    /* specific HttpRequestFactory here */);

@RequestMapping(path = "/shiny-proxy/**")
public ResponseEntity<String> mirrorRest(@RequestBody(required = false) String body,
        HttpMethod method, HttpServletRequest request) throws URISyntaxException {
    String path = StringUtils.removeStart(request.getRequestURI(), "/project/shiny-proxy");
    boolean websocket = false;
    URI uri;
    if (path.endsWith("/websocket/")) {
        websocket = true;
        // restore the ws:// that the request URL started with after Spring MVC makes it http://
        uri = new URI("ws", null, "localhost", 3305, path, request.getQueryString(), null);
    } else {
        uri = new URI(request.getScheme(), null, "localhost", 3305, path, request.getQueryString(), null);
    }
    if (websocket) {
        System.out.println(request.getRequestURL().toString());
        System.out.println(request.getRequestURI());
        System.out.println(path);
        System.out.println(uri);
    }

    HttpHeaders headers = new HttpHeaders();
    if (path.endsWith(".css.map")) { // special handling for unusual content types from Shiny
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    }
    HttpEntity<String> httpEntity = new HttpEntity<>(body, headers);
    ResponseEntity<String> ret = null;
    try {
        ret = restTemplate.exchange(uri, method, httpEntity, String.class);
    } catch (Exception e) {
        System.out.println(request.getRequestURL().toString());
        System.out.println(request.getRequestURI());
        System.out.println(path);
        System.out.println(uri);
        e.printStackTrace();
    }

    if (websocket) {
        System.out.println("ResponseEntity headers: " + ret.getHeaders());
    }
    return ret;
}

但是我找不到任何HttpRequestFactory可以使用ws://URL(其中许多URL将URI转换为java.net.URL,而java.net.URL,不支持ws://,我测试过的其他URL也不能在反射代码中处理ws://),即使可以,我也不确定返回ResponseEntity是否适用于ws连接。

所以我的问题是,在给定ws://请求URL的情况下,是否有任何方法可以让控制器在客户机和本地主机:3305之间正确地建立websocket连接,或者我应该放弃RestTemplate的想法而尝试配置的代理,比如Nginx?

共有1个答案

祝允晨
2023-03-14

结果表明,在我的例子中,使用配置的代理的解决方案非常简单:在/opt/bitnami/apache2/conf/httpd.conf中启用include conf/extra/httpd-vhosts.conf,

并将httpd-vhosts.conf的内容设置为:

<VirtualHost *:80>
  RewriteEngine on
  RewriteRule /project/shiny-proxy/websocket/(.*) ws://localhost:3305/websocket/$1 [P,L]
</VirtualHost>

Bitnami的默认配置非常好,不需要进行其他更改。

 类似资料:
  • 问题内容: 是否可以在不关闭整个服务器的情况下终止服务器的Websocket连接?如果是这样,我该如何实现呢? 注意:我使用NodeJS作为后端和’ws’websocket模块。 问题答案: 如果要踢所有客户端而不关闭服务器,则可以执行以下操作: 如果您要特别寻找一个,也可以进行过滤。如果您要踢客户端作为连接逻辑的一部分(即,它发送错误的数据等),则可以执行以下操作: 和一个基本的客户 你会得到:

  • 问题内容: 我有一个包含2个字段(名称,兴趣)的表,我想查找所有具有相同兴趣的对,并删除所有重复项和镜像对。 我可以找到所有对,并使用以下SQL语句删除重复项: 但是我不确定如何删除镜像对,即: 我试图使上面的语句成为一个称为Matches的视图,并尝试了以下查询: 但是它不会删除所有镜像对。 问题答案: 假设您不在乎哪个对最终会粘在(ben,will)与(will,ben)之间,那么我的首选解决

  • 问题内容: 我在服务器中使用,因此客户端可以从服务器获取通知。 但是,似乎客户端连接到服务器后,如果客户端和服务器之间没有任何数据传输,服务器将在处返回EOF错误,这看起来像是一种超时机制。 我在Google中搜索过,看来websocket协议具有 乒乓 心跳来维持连接,我想问一下是否支持此ping协议? 如果要保持客户端与服务器之间的连接有效,该怎么办? 问题答案: 直到2013年,go.net

  • null 在Jenkins主节点日志中,我发现(系统日志级别设置为ALL): 警告O.E.J.W.S.WebSocketServerFactory#ISUpgradeRequest:不是'HTTP/1.1'请求(was[HTTP/1.0]) 问题是 为什么apache反向代理将HTTP/1.1切换到HTTP/1.0,以便与后端进行websocket通信,以及如何修复它? 我在apache中尝试了许

  • 熟悉虚拟机镜像的管理流程。 镜像 box 就是 Vagrant 里用的系统镜像。镜像有点像是把安装好的操作系统打了个包,生成一个文件。Vagrant 里的 box 有不同的类型,可以用在不同的 Provider 上,比如有适合在 Virtualbox 上用的 box,有适合在 VMware 上用的 box。 Vagrant 在它的云服务上提供下载这些镜像,有的镜像是 CentOS 系统,有些是 U

  • 用户的角色是由云管理员分配的。不同的角色决定了一个用户是否有上传和管理镜像的权限。云管理员一般都会将上传和管理镜像的权限限制在管理员范围内。 您可以用glance工具上传镜像,可以用nova工具管理镜像。后者可以让您列出镜像和删除镜像,设置和删除镜像元数据,以及用快照或备份的形式创建运行中的实例的镜像。 一旦您上传了镜像,就没办法更改了。 欲了解创建镜像的内容,请参阅Virtual Machine