A la spring mvc rest service redirect / forward / proxy , контроллер отражает приложение Shiny, так что мы сохраняем контроль доступа:
import java.net.URI;
import java.util.Arrays;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
@Controller
public class ShinyController
{
private static final RestTemplate restTemplate = new RestTemplate();
@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");
URI uri = new URI(request.getScheme(), null, "localhost", 3305,
path, request.getQueryString(), null);
HttpHeaders headers = new HttpHeaders();
if (path.endsWith(".css.map")) {
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
}
HttpEntity<String> httpEntity = new HttpEntity<>(body, headers);
return restTemplate.exchange(uri, method, httpEntity, String.class);
}
}
Это обрабатывает HTML страницы Shinyи все его ресурсы.В представлении JSP
<iframe src="shiny-proxy/">
Теперь нам просто нужно обработать ws: // [блестящий URL] / websocket / request.
В web.xml запретить обработку веб-серверачерез:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/project/shiny-proxy/websocket/</url-pattern>
</servlet-mapping>
Затем включите Include conf/extra/httpd-vhosts.conf
в /opt/bitnami/apache2/conf/httpd.conf
,
и установите для содержимого httpd-vhosts.conf
:
<VirtualHost *:80>
RewriteEngine on
RewriteRule /project/shiny-proxy/websocket/(.*) ws://localhost:3305/websocket/$1 [P,L]
</VirtualHost>
так... оказалось довольно просто.