Как использовать ServletContextHandler для статического контента внутри jar и SessionHandler для динамического контента с молой? - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь использовать jetty для возврата статических html-страниц из jar-файла и обслуживания некоторых функций сервлета.

В настоящее время он работает, ожидая ошибки в журналах:

2019-10-16 16:13:24.988:WARN:oejs.HttpChannel:qtp1047503754-14: /foo/foo.html
java.lang.IllegalStateException: Response is COMMITTED
        at org.eclipse.jetty.server.HttpChannelState.sendError(HttpChannelState.java:901)
        at org.eclipse.jetty.server.Response.sendError(Response.java:406)
        at org.eclipse.jetty.server.Response.sendError(Response.java:377)
        at org.eclipse.jetty.servlet.ServletHandler$Default404Servlet.doGet(ServletHandler.java:1753)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:760)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:547)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1561)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
        at org.eclipse.jetty.server.Server.handle(Server.java:500)
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:386)
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:560)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:378)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:268)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
        at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:135)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:782)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:914)
        at java.lang.Thread.run(Thread.java:748)

Полагаю, это связано с тем, что я пытаюсь использовать и ServletHandler, и ServletContextHandler, используя HandlerCollection, но я не знаю, что делать.

    public static Server createServer(int port) throws Exception {
        Server server = new Server(port);

        HandlerCollection handlerCollection = new HandlerCollection();

        ServletHandler handler = new ServletHandler();
        handler.addServletWithMapping(HelloServlet.class, "/hello");
        // handler.addServletWithMapping(ErrServlet.class, "/*");

        SessionHandler sessionHandler = new SessionHandler();
        DefaultSessionCache sessionCache = new DefaultSessionCache(sessionHandler);
        NullSessionDataStoreFactory dataStore = new NullSessionDataStoreFactory();
        sessionCache.setSessionDataStore(dataStore.getSessionDataStore(sessionHandler));
        sessionHandler.setSessionCache(sessionCache);
        DefaultSessionIdManager sessionIdManager = new DefaultSessionIdManager(server);
        sessionHandler.setSessionIdManager(sessionIdManager);
        handler.setHandler(sessionHandler);

        URL fileURL = App.class.getClassLoader().getResource("static/foo.html");
        URI webRootUri = fileURL.toURI().resolve("./").normalize();

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setBaseResource(Resource.newResource(webRootUri));
        context.setContextPath("/foo/");

        ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class);
        holderPwd.setInitParameter("dirAllowed", "false");
        context.addServlet(holderPwd, "/");

        handlerCollection.addHandler(context);
        handlerCollection.addHandler(handler);

        server.setHandler(handlerCollection);
        return server;
    }

Как настроитьсервер для обслуживания статического и динамического контента с SessionHandler?

...