Встроенный Jetty переписать и перенаправить http в https и путь, используя RewriteHandler и SecuredRedirectHandler - PullRequest
0 голосов
/ 03 октября 2018

У меня есть встроенное приложение Jetty (Jetty 9.3.12), которое мне нужно для перенаправления запросов с http://host и http://host/my/app на https://host/my/app

Я использую RewriteHandlerна некоторое время, чтобы успешно перенаправить http://host -> http://host/my/app и https://host -> https://host/my/app.

Я не могу понятьКак заставить http://host -> https://host/my/app работать.

У меня также есть другой контекст причала, который обрабатывает тот же Сервер, который я назову / другим (не отражается)в коде ниже).Я не хочу перенаправлять http://other -> https://other.

Вот краткое изложение того, что я хочу, чтобы сделать

http:// -> https://my/app 
http://my/app -> https://my/app 
https:// -> https://my/app 
http://other -> no change

Если я добавлю SecuredRedirectHandler непосредственно на серверобработчики (см. АЛЬТЕРНАТИВНЫЙ МЕТОД в коде), чем я получаю 404 Проблема доступа к / my / app.Причина: не найден.

Если я добавлю SecuredRedirectHandler за RewriteHandler, то ничего не произойдет (код ниже).

private Server createServer() {
    Server server = new Server();
    configureConnectors(server);
    HandlerCollection handlers = getHandlers(server);

    RewriteHandler rewriteHandler = createRewriteHandler(server);
    server.setHandler(rewriteHandler);

    return server;
}

private void configureConnectors(Server server) {
    List<ServerConnector> connectors = new ArrayList<>();
    ServerConnect httpsConnector = createHttpsConnector(server);
    boolean httpsEnabled = httpsConnector != null;
    ServerConnector httpConnector = createHttpConnector(server, httpsEnabled);
    connectors.add(httpConnector);
    connectors.add(httpsConnector);
    // ALTERNATIVE METHOD - Results in 404 - Problem access /my/app Reason: Not Found
    //addHandlerAsFirst(new SecuredRedirectHandler(), server);

    for (ServerConnector connector : connectors) {
        server.addConnector(connector);
    }
}

private ServerConnector createHttpConnector(Server server, boolean httpsEnabled) {
    HttpConfiguration httpConfig = new HttpConfiguration();
    if (httpsEnabled) {
        Integer httpsPort = getServiceUrl().getPortSsl();
        httpConfig.addCustomizer(new SecureRequestCustomizer());
        httpConfig.setSecureScheme(HttpScheme.HTTPS.asString());
        httpConfig.setSecurePort(httpsPort);
    }

    Integer port = getServiceUrl().getPort();

    ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfig));
    connector.setPort(port);
    configureConnector(connector);

    return connector;
}

private ServerConnector createHttpsConnector(Server server) {
    Integer httpsPort = getServiceUrl().getPortSsl();
    Integer port = httpsPort;

    HttpConfiguration httpConfig = new HttpConfiguration();
    httpConfig.addCustomizer(new SecureRequestCustomizer());
    SslContextFactory sslContextFactory = null;
    try {
        sslContextFactory = createSslContextFactory();
    } catch (ConfigurationException | NotFoundException e) {
        log.err(m, e, "Create SSL Context failed: Perhaps Certificate Policy Bindings are not configured?");
        return null;
    }

    SslConnectionFactory connectionFactory = new SslConnectionFactory(sslContextFactory, HTTP_VERSION);

    ServerConnector connector = new ServerConnector(server, connectionFactory, new HttpConnectionFactory(httpConfig));
    connector.setPort(port);
    configureConnector(connector);

    return connector;
}

public RewriteHandler createRewriteContext(HandlerCollection handlerCollection) {
    RewriteHandler rewrite = new RewriteHandler();
    rewrite.setRewriteRequestURI(true);
    rewrite.setRewritePathInfo(false);
    rewrite.setOriginalPathAttribute("requestedPath");
    rewrite.setHandler(handlerCollection);

    String path = AppProductConfig.CONSOLE_CONTEXT_ROOT + AppUI.APP_PATH;

    /*
     * Redirect "/" to "/console/app".  We use redirect instead of rewrite
     * because Vaadin needs to access it's widgetset files.  The rewrite requires
     * multiple rules to accomplish this.  The redirect is simpler.
     */
    RedirectPatternRule rootRule = new RedirectPatternRule();
    rootRule.setPattern(""); // Redirect / (root)
    rootRule.setLocation(path);
    rewrite.addRule(rootRule);

    return rewrite;
}
protected void addHandlerAsFirst(Handler handler, Server server) {
    HandlerCollection handlers = handlersMap.get(server);
    if (handlers == null) {
        handlers = new HandlerCollection();
        handlersMap.put(server, handlers);
    }

    handlers.prependHandler(handler);
}

решено

Я смог заставить работать вещи, используя этот подход: Jetty 9.2.1 перенаправляет http на https

1 Ответ

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

У вас будет 2 перенаправления, а не 1.

Server
  HandlerList
    SecuredRedirectHandler
    RewriteHandler
      Rule -> "/" to "/my/app"
    ServletContextHandler or WebAppContext
    DefaultHandler

Не пытайтесь переписать путь и ТАКЖЕ перенаправить на HTTPS.Просто позвольте каждому делать свое дело независимо.

Подумайте об этих сценариях:

  • http://host/my/app (использует только SecuredRedirectHandler)
  • https://host/ (использует RewriteHandlerтолько)
  • http://host/ (2 перенаправления, один раз для схемы, второй для пути)
...