我几乎已经完成了如何将服务器端闪亮的应用程序嵌入到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?
结果表明,在我的例子中,使用配置的代理的解决方案非常简单:在/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