Я пытаюсь использовать 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
?