这是在 9 号和 10 号码头添加上下文的正确方法吗?

Is this correct way of adding contexts in jetty 9 and 10?

提问人:Avinash Modi 提问时间:11/10/2021 更新时间:11/12/2021 访问量:544

问:

我正在使用嵌入式码头并通过xml文件加载上下文。 在我的应用程序中,在我的 jetty 6.1.7 版本中部署了以下上下文:

    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.mortbay.jetty.servlet.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.TransformationServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/monitor</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.mortbay.jetty.servlet.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.MonitorServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/blazon</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.mortbay.jetty.servlet.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.BlazonJobServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>  
    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/getCapabilities</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.mortbay.jetty.servlet.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.CapabilityServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/output</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/../cache/</Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/resource</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/../resource/</Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/canExecute</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.mortbay.jetty.servlet.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.CanExecuteServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/getOccupancy</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.mortbay.jetty.servlet.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.GetOccupancyServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.mortbay.jetty.servlet.Context">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/delete</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.home" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.mortbay.jetty.servlet.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.CleanupJobServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>

我们正在迁移到 9 号码头,并尝试部署如下上下文:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.base" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.eclipse.jetty.server.session.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.TransformationServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/monitor</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.base" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.eclipse.jetty.server.session.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.MonitorServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/blazon</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.base" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.eclipse.jetty.server.session.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.BlazonJobServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>  
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/getCapabilities</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.base" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.eclipse.jetty.server.session.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.CapabilityServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/output</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.base" default="."/>/../cache/</Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/resource</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.base" default="."/>/../resource/</Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/canExecute</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.base" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.eclipse.jetty.server.session.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.CanExecuteServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/getOccupancy</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.base" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.eclipse.jetty.server.session.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.GetOccupancyServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
    <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Arg>
            <Ref id="Contexts"/>
        </Arg>
        <Arg>/cts/delete</Arg>
        <Set name="resourceBase">
            <SystemProperty name="jetty.base" default="."/>/</Set>
        <Set name="sessionHandler">
            <New class="org.eclipse.jetty.server.session.SessionHandler"/>
        </Set>
        <Call name="addServlet">
            <Arg>com.docu.cts.webservices.remote.CleanupJobServlet</Arg>
            <Arg>/</Arg>
        </Call>
    </New>
</Configure> 

基本上我已经使用了最新的 jetty API,就是这样,我不确定这是否是部署上下文的正确方式。 提供的任何意见都将非常有帮助。

servlet 嵌入式 jetty-9 xml-configuration 码头-10

评论


答:

1赞 Joakim Erdfelt 11/12/2021 #1

所有这些细节都包含在我之前在如何通过xml配置在SSL模式下启用嵌入式jetty 9的回答中。 (包括指向示例项目的链接,该项目完全按照您在那里和此处的要求执行操作)

在处理上下文和 XML 时,不要使用构造函数技术(又名元素)(这些技术是为 from 的实现保留的,您显然没有使用)。ServletContextHandler<Arg>AppProviderDeploymentManager

您的 Jetty 9 XML 已设置为配置 的 id(该 id 为 类)。Contextsorg.eclipse.jetty.server.handler.ContextHandlerCollection

然后它创建一堆对象(元素),并且不会将它们添加到任何地方。同样,不要使用构造函数技术。ServletContextHandler<New>

你所拥有的是不属于任何地方的孤立上下文,Jetty 不知道它们。

你有几件事需要解决。

  1. 删除 的第一级 中的元素。<Arg><New class="org.eclipse.jetty.servlet.ServletContextHandler">
  2. 为每个上下文添加适当的内容(确保不要在所选上下文中重叠或导致冲突,就像您当前所做的那样)<Set name="contextPath">/cts</Set>ServletContextHandler
  3. 适当地使用 Servlet。如果你使用 of,那就是“默认”模式,这意味着你的模式非常重要,你必须在你的 servlet 实现中满足“默认 Servlet”的规则。url-patternurl-pattern/resourceBase
  4. 使用单个以避免为每个上下文使用单独的对象/树/存储(这是由 Jetty 和 Servlet 规范强制执行的,不能被覆盖)。例如:您的上下文不能设置/查看/使用 from,反之亦然。ServletContextHandlerHttpSession/cts/deleteHttpSession/cts
  5. 最后,将结果添加到 .ServletContextHandlerContextHandlerCollection

将所有建议放在一起,将其分解为一个(以避免 ResourceBase 和 HttpSession 出现问题),您将得到以下结果:ServletContextHandler

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
  <Call name="addHandler">
    <Arg>
      <New class="org.eclipse.jetty.servlet.ServletContextHandler">
        <Set name="contextPath">/cts</Set>
        <!-- it would be smarter to have a `base` dir with `/resource` and `/output` sub directories, to avoid having to redeclare the locations in your specific servlets) -->
        <Set name="resourceBase"><SystemProperty name="jetty.base" default="."/>/</Set>
        <!-- This is incomplete, like you have it, so I left it incomplete.
             Your HTTP Sessions will likely not behave like you expect
             if you leave it like this -->
        <Set name="sessionHandler">
          <New class="org.eclipse.jetty.server.session.SessionHandler"/>
        </Set>
        <!-- Use url-pattern properly, not separate Contexts! -->
        <Call name="addServlet">
          <Arg>com.docu.cts.webservices.remote.TransformationServlet</Arg>
          <Arg>/</Arg>
        </Call>
        <Call name="addServlet">
          <Arg>com.docu.cts.webservices.remote.MonitorServlet</Arg>
          <Arg>/monitor</Arg>
        </Call>
        <Call name="addServlet">
          <Arg>com.docu.cts.webservices.remote.BlazonJobServlet</Arg>
          <Arg>/blazon</Arg>
        </Call>
        <Call name="addServlet">
          <Arg>com.docu.cts.webservices.remote.CapabilityServlet</Arg>
          <Arg>/getCapabilities</Arg>
        </Call>
        <Call name="addServlet">
          <Arg>com.docu.cts.webservices.remote.CanExecuteServlet</Arg>
          <Arg>/canExecute</Arg>
        </Call>
        <Call name="addServlet">
          <Arg>com.docu.cts.webservices.remote.GetOccupancyServlet</Arg>
          <Arg>/getOccupancy</Arg>
        </Call>
        <Call name="addServlet">
          <Arg>com.docu.cts.webservices.remote.CleanupJobServlet</Arg>
          <Arg>/delete</Arg>
        </Call>
        <!-- The location of the content needs to be passed in as it doesn't fit within the base resource cleanly.
             Easily fixed by having a sane directory structure for your resource base you pass into the servlet context handler instead. -->
        <Call name="addServlet">
          <Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
          <Arg>/output</Arg>
          <Call name="setInitParameter">
            <Arg>fileContentBase</Arg>
            <Arg><SystemProperty name="jetty.base" default="."/>/../cache/</Arg>
          </Call>
        </Call>
        <!-- The location of the content needs to be passed in as it doesn't fit within the base resource cleanly.
             Easily fixed by having a sane directory structure for your resource base you pass into the servlet context handler instead. -->
        <Call name="addServlet">
          <Arg>com.docu.cts.webservices.remote.FileProxyServlet</Arg>
          <Arg>/resource</Arg>
          <Call name="setInitParameter">
            <Arg>fileContentBase</Arg>
            <Arg><SystemProperty name="jetty.base" default="."/>/../resource/</Arg>
          </Call>
        </Call>
      </New>
    </Arg>
  </Call>
</Configure>