Jetty 9.x ProxyServlet-如何在XML中正确设置ServletContext

Jetty 9.x ProxyServlet-如何在XML中正确设置ServletContext,xml,configuration,reverse-proxy,jetty-9,Xml,Configuration,Reverse Proxy,Jetty 9,旨在通过运行webappservlet和代理servlet以及部署和控制台日志记录等其他工具在本地启动Jetty。所有Jetty配置都在XML文件中 代理servlet将代理获取前缀为/media/*的请求反向到外部站点https://example-server/。因此将通过 下面是我的jetty.xml的摘录: <Set name="handler"> <New id="Handlers" class="org.eclipse.jetty.server.handler.

旨在通过运行webappservlet和代理servlet以及部署和控制台日志记录等其他工具在本地启动Jetty。所有Jetty配置都在XML文件中

代理servlet将代理
获取前缀为
/media/*
的请求反向到外部站点
https://example-server/
。因此将通过

下面是我的
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>
这是根据默认的
jetty.xml

在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
请求上激活

下面是显示
ServletContextHandler
正在启动的日志行

2018-09-28 15:26:46.045:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@1e028a9{"",null,AVAILABLE}
我想有一个简单的解决方案,比如正确设置ServletContext,但我不知道如何在XML中实现这一点,我非常感谢您的帮助。这上面的码头很薄

现在,如果我将
jetty.xml
更改为下面的值,那么代理会在
GET
请求到`'时激活


但是这里代理失败,因为它有
null
上下文。因此,将前缀()设置为
null/media
是因为
ServletContext.getContextPath()
为null。这会导致重定向到
null
,因为。如果
\u prefix
设置为
null/media
,则没有任何内容与之匹配。这可能是一个bug,我已经打开了一个问题。

一个解决方案-不完全是我想要做的,但它是有效的-是从与webapp关联的
web.xml
启动ProxyServlet

<servlet>
  <servlet-name>JettyProxy</servlet-name>
  <servlet-class>org.eclipse.jetty.proxy.ProxyServlet$Transparent</servlet-class>
  <init-param>
    <param-name>proxyTo</param-name>
    <param-value>https://media-server</param-value>
  </init-param>
  <init-param>
    <param-name>prefix</param-name>
    <param-value>/media</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
  <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
  <servlet-name>JettyProxy</servlet-name>
  <url-pattern>/media/*</url-pattern>
</servlet-mapping>
web.xml
这样做与从Jetty自己的配置中这样做有一些区别,正如我在OP中所想的那样

  • 代理URL现在必须采用以下形式(其中webapp是webapp名称):
  • Jetty版本更改时,webapp必须更新
    web.xml
    ——这可能是远程托管应用程序的问题
  • 每个webapp都必须包含这个,而不是“内置”到Jetty
  • 与Jetty能够为不同的路径设置不同的servlet相比,这感觉很不雅观——因为代理的URL现在也被webapp的过滤器解析,所以这里的性能会受到影响吗
  • 代理请求周期完成时可能阻塞webapp的线程(需要测试…)

  • 下面是一个从
    ${jetty.base}
    目录使用
    ProxyServlet
    的示例

    $ mkdir proxy-example-base
    $ cd proxy-example-base/
    $ java -jar ../../jetty-home-9.4.12.v20180830/start.jar --add-to-start=http,deploy,proxy
    INFO  : webapp          transitively enabled, ini template available with --add-to-start=webapp
    INFO  : server          transitively enabled, ini template available with --add-to-start=server
    INFO  : proxy           initialized in ${jetty.base}/start.ini
    INFO  : security        transitively enabled
    INFO  : servlet         transitively enabled
    INFO  : http            initialized in ${jetty.base}/start.ini
    INFO  : client          transitively enabled
    INFO  : threadpool      transitively enabled, ini template available with --add-to-start=threadpool
    INFO  : deploy          initialized in ${jetty.base}/start.ini
    MKDIR : ${jetty.base}/webapps
    INFO  : Base directory was modified
    $ ls -la
    total 8
    drwxr-xr-x   4 joakim  staff   136 Oct  1 14:10 ./
    drwxr-xr-x  17 joakim  staff   578 Oct  1 14:10 ../
    -rw-r--r--   1 joakim  staff  2146 Oct  1 14:10 start.ini
    drwxr-xr-x   3 joakim  staff   102 Oct  1 14:11 webapps/
    $ cp ~/Downloads/media-proxy.xml webapps/
    $ cat webapps/media-proxy.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
    <Configure class="org.eclipse.jetty.servlet.ServletContextHandler">
      <Set name="contextPath">/</Set>
      <Call name="addServlet">
        <Arg>org.eclipse.jetty.proxy.ProxyServlet$Transparent.class</Arg>
        <Arg>/media/*</Arg>
        <Set name="InitOrder">1</Set>
        <Call name="setInitParameter">
          <Arg>proxyTo</Arg>
          <Arg>https://media-server/</Arg>
        </Call>
        <Call name="setInitParameter">
          <Arg>prefix</Arg>
          <Arg>/media</Arg>
        </Call>
      </Call>
    </Configure>
    
    $mkdir代理示例库
    $cd代理示例库/
    $java-jar.././jetty-home-9.4.12.v20180830/start.jar——添加到start=http,部署,代理
    信息:webapp已过渡启用,ini模板可与--add to start=webapp一起使用
    信息:服务器已过渡启用,ini模板可与--add to start=server一起使用
    信息:代理已在${jetty.base}/start.ini中初始化
    信息:安全性可传递启用
    信息:可传递地启用servlet
    信息:http在${jetty.base}/start.ini中初始化
    信息:客户端可传递地启用
    信息:线程池已过渡启用,ini模板可与--add to start=threadpool一起使用
    信息:部署在${jetty.base}/start.ini中初始化
    MKDIR:${jetty.base}/webapps
    信息:基本目录已修改
    $ls-la
    总数8
    drwxr-xr-x 4 joakim员工136 10月1日14:10/
    drwxr-xr-x 17 joakim员工578 10月1日14:10/
    -rw-r--r--1 joakim staff 2146 10月1日14:10 start.ini
    drwxr-xr-x 3 joakim员工102 10月1日14:11网络应用/
    $cp~/Downloads/media-proxy.xml webapps/
    $cat webapps/media-proxy.xml
    /
    org.eclipse.jetty.proxy.ProxyServlet$Transparent.class
    /媒体/*
    1.
    代理
    https://media-server/
    前缀
    /媒体
    
    其工作方式是将
    ${jetty.base}
    配置为启用
    proxy
    jetty模块,从而将代理类放在服务器类路径上

    然后启用
    deploy
    jetty模块,在
    ${jetty.base}/webapps/
    目录中查找webapps的配置并进行部署


    最后,一个可部署的XML被设置为在
    /
    上下文路径上有一个
    javax.servlet.ServletContext
    ,还有一个已定义的servlet,
    ProxyServlet$Transparent
    ,带有一些init参数。

    谢谢,非常感谢。此XML似乎相当于以下Java代码:
    ServletContextHandler context=new ServletContextHandler();context.setContextPath(“/”);ServletHolder=context.addServlet(ProxyServlet$Transparent.class,“/media/*”;持有人。setInitOrder(1);holder.setInitParameter(“proxyTo”https://media-server"); holder.setInitParameter(“前缀”、“/media”)
    
    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
    
    <servlet>
      <servlet-name>JettyProxy</servlet-name>
      <servlet-class>org.eclipse.jetty.proxy.ProxyServlet$Transparent</servlet-class>
      <init-param>
        <param-name>proxyTo</param-name>
        <param-value>https://media-server</param-value>
      </init-param>
      <init-param>
        <param-name>prefix</param-name>
        <param-value>/media</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
      <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
      <servlet-name>JettyProxy</servlet-name>
      <url-pattern>/media/*</url-pattern>
    </servlet-mapping>
    
    <dependency>
       <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-proxy</artifactId>
      <version>9.4.12.v20180830</version>
    </dependency>
    
    $ mkdir proxy-example-base
    $ cd proxy-example-base/
    $ java -jar ../../jetty-home-9.4.12.v20180830/start.jar --add-to-start=http,deploy,proxy
    INFO  : webapp          transitively enabled, ini template available with --add-to-start=webapp
    INFO  : server          transitively enabled, ini template available with --add-to-start=server
    INFO  : proxy           initialized in ${jetty.base}/start.ini
    INFO  : security        transitively enabled
    INFO  : servlet         transitively enabled
    INFO  : http            initialized in ${jetty.base}/start.ini
    INFO  : client          transitively enabled
    INFO  : threadpool      transitively enabled, ini template available with --add-to-start=threadpool
    INFO  : deploy          initialized in ${jetty.base}/start.ini
    MKDIR : ${jetty.base}/webapps
    INFO  : Base directory was modified
    $ ls -la
    total 8
    drwxr-xr-x   4 joakim  staff   136 Oct  1 14:10 ./
    drwxr-xr-x  17 joakim  staff   578 Oct  1 14:10 ../
    -rw-r--r--   1 joakim  staff  2146 Oct  1 14:10 start.ini
    drwxr-xr-x   3 joakim  staff   102 Oct  1 14:11 webapps/
    $ cp ~/Downloads/media-proxy.xml webapps/
    $ cat webapps/media-proxy.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
    <Configure class="org.eclipse.jetty.servlet.ServletContextHandler">
      <Set name="contextPath">/</Set>
      <Call name="addServlet">
        <Arg>org.eclipse.jetty.proxy.ProxyServlet$Transparent.class</Arg>
        <Arg>/media/*</Arg>
        <Set name="InitOrder">1</Set>
        <Call name="setInitParameter">
          <Arg>proxyTo</Arg>
          <Arg>https://media-server/</Arg>
        </Call>
        <Call name="setInitParameter">
          <Arg>prefix</Arg>
          <Arg>/media</Arg>
        </Call>
      </Call>
    </Configure>