Как встраивать серверное приложение Shiny в страницу JSP, не раскрывая приложение в другом месте - PullRequest
0 голосов
/ 02 октября 2018

У меня есть приложение Shiny, которое я хочу встроить на страницу своего веб-сервера Java 8, размещенного на Amazon AWS.(Примечание: я говорю «вставлять», потому что большинство страниц в веб-сервере имеют общую боковую панель и нижний колонтитул - это применяется автоматически к большинству представлений, так что файлы .jsp должны обеспечивать только HTML для реального содержания страницы).

Приложение Shiny прослушивает 3305, а веб-сервер размещает: 8080 на локальном хосте ([server ip] /subject/index.html отлично работает для получения веб-страниц через другие машины).

Встраивание ShinyПриложение отлично работает для локального хоста, используя глянцевый файл .jsp, содержащий <iframe src="http://localhost:3305">, но при просмотре с другой машины страница ищет сервер блеска только на той другой машине, когда она должна просматриваться на хост-компьютере.Если оставить «http://"», приложение Shiny никогда не получит запрос, а страница останется пустой, а обмен «localhost» на «127.0.0.1» не приведет к заметным изменениям.

Сервер использует Spring,JSTL и Apache Tomcat 7.0.

Я не могу просто перенести порт Shiny в приложение, чтобы сделать его видимым вне сервера, поскольку приложение отображает конфиденциальную информацию. В .jsp это небеспокойство, так как iframe может быть заключен в тег <security:authorize> (веб-сайт требует входа в систему для доступа к любым страницам в первую очередь).

Вопрос в том, как проще всего встроить приложение Shiny встраницу .jsp, так что она остается интерактивной для пользователя, но является безопасной (к ней нельзя получить прямой доступ без авторизации извне сервера) и не требует дополнительных входов в систему?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

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>

так... оказалось довольно просто.

0 голосов
/ 07 октября 2018

Вы можете использовать прокси-API на своем веб-сервере для получения содержимого приложения Shiny.Затем вы можете использовать iframe для отображения содержимого блестящего приложения, используя прокси как src.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...