Стремление запустить Jetty локально с запущенным сервлетом веб-приложения и сервлетом-посредником, а также другими инструментами, такими как развертывание и ведение журнала консоли.Вся конфигурация Jetty находится в XML-файлах.
Прокси-сервлет обратный прокси-сервер GET
запросов с префиксом /media/*
на внешний сайт https://example-server/
.Так что http://localhost:8080/media/image.jpg перейдет на https://media -сервер / image.jpg .
Вот выдержка из моего jetty.xml
:
<Set name="handler">
<New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
<New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
</Item>
<Item>
<New id="context" class="org.eclipse.jetty.servlet.ServletContextHandler">
<Arg><Get class="org.eclipse.jetty.servlet.ServletContextHandler" name="SESSIONS"/></Arg>
<Call name="setContextPath" arg="/"/>
<Set name="servletHandler">
<New id="handler" class="org.eclipse.jetty.servlet.ServletHandler">
<Call id="holder" name="addServletWithMapping" arg="org.eclipse.jetty.proxy.ProxyServlet$Transparent,/media/*">
<Call name="setInitParameter" arg="proxyTo,https://media-server"/>
<Call name="setInitParameter" arg="prefix,/media"/>
</Call>
</New>
</Set>
</New>
</Item>
<Item>
<New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
</Item>
</Array>
</Set>
</New>
</Set>
Приведенный выше XML должен быть эквивалентен этому Java-коду.
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
ServletHandler handler = new ServletHandler();
ServletHolder holder = handler.addServletWithMapping(ProxyServlet$Transparent.class, "/media/*");
holder.setInitParameter("proxyTo", "https://media-server");
holder.setInitParameter("prefix", "/media");
context.setServletHandler(handler);
Это адаптировано из значений по умолчанию jetty.xml
и https://dzone.com/articles/configuring-jetty-servlet-proxy
Из руководства по DZone я обновил классназвания для Jetty 9.x.Таким образом, org.eclipse.jetty.servlets.ProxyServlet
теперь org.eclipse.jetty.proxy.ProxyServlet
, а параметры proxyTo
и prefix
должны начинаться со строчной буквы p
.
. Проверено, что jetty-proxy-9.4.12.v20180830.jar
включена в качестве библиотеки в конфигурации запуска Jetty.
Для ведения журнала командная строка Jetty включает -Dorg.eclipse.jetty.proxy.LEVEL=DEBUG
(я рекомендую это для устранения неполадок ProxyServlet.)
Проблема: ничего не происходит.ProxyServlet
не активируется на GET
запросах к `http://localhost:8080/media/image.jpg'.
Вот строка журнала, показывающая, что ServletContextHandler
запускается.
2018-09-28 15:26:46.045:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@1e028a9{"",null,AVAILABLE}
Я думаю, что естьЭто простое решение, например, правильная настройка ServletContext, но я не могу понять, как это сделать в XML, и буду очень признателен за помощь.Jetty документация на это тонкая.
Теперь, если я изменю jetty.xml
на это ниже, то прокси делает активировать на GET
запросы к `http://localhost:8080/media/image.jpg'.
<Set name="handler">
<New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
<New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
</Item>
<Item>
<New id="handler" class="org.eclipse.jetty.servlet.ServletHandler">
<Call id="holder" name="addServletWithMapping" arg="org.eclipse.jetty.proxy.ProxyServlet$Transparent,/media/*">
<Call name="setInitParameter" arg="proxyTo,https://media-server"/>
<Call name="setInitParameter" arg="prefix,/media"/>
</Call>
</New>
</Item>
<Item>
<New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
</Item>
</Array>
</Set>
</New>
</Set>
В журнале показано, как ProxyServlet активируется следующим образом:
2018-09-28 14:22:14.904:DBUG:oejpP.194a1b5:qtp22374712-13: org.eclipse.jetty.proxy.ProxyServlet$Transparent-194a1b5 @ null/media to https://media-server
2018-09-28 14:22:14.904:DBUG:oejpP.194a1b5:qtp22374712-13: 21964987 rewriting: http://localhost:8080/media/image.jpg -> null
Но здесь прокси не работает, потому что у него1072 * контекст.Таким образом, префикс был установлен ( исходный код ) на null/media
, потому что ServletContext.getContextPath()
равен нулю.И это вызывает перенаправление на null
из-за этого исходного кода .С _prefix
, установленным на null/media
, ничто не сравнится с этим.Возможно, это ошибка, я открыл проблему.