提问人:Avinash Modi 提问时间:11/10/2021 更新时间:11/12/2021 访问量:544
这是在 9 号和 10 号码头添加上下文的正确方法吗?
Is this correct way of adding contexts in jetty 9 and 10?
问:
我正在使用嵌入式码头并通过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,就是这样,我不确定这是否是部署上下文的正确方式。 提供的任何意见都将非常有帮助。
答:
1赞
Joakim Erdfelt
11/12/2021
#1
所有这些细节都包含在我之前在如何通过xml配置在SSL模式下启用嵌入式jetty 9的回答中。 (包括指向示例项目的链接,该项目完全按照您在那里和此处的要求执行操作)
在处理上下文和 XML 时,不要使用构造函数技术(又名元素)(这些技术是为 from 的实现保留的,您显然没有使用)。ServletContextHandler
<Arg>
AppProvider
DeploymentManager
您的 Jetty 9 XML 已设置为配置 的 id(该 id 为 类)。Contexts
org.eclipse.jetty.server.handler.ContextHandlerCollection
然后它创建一堆对象(元素),并且不会将它们添加到任何地方。同样,不要使用构造函数技术。ServletContextHandler
<New>
你所拥有的是不属于任何地方的孤立上下文,Jetty 不知道它们。
你有几件事需要解决。
- 删除 的第一级 中的元素。
<Arg>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
- 为每个上下文添加适当的内容(确保不要在所选上下文中重叠或导致冲突,就像您当前所做的那样)
<Set name="contextPath">/cts</Set>
ServletContextHandler
- 适当地使用 Servlet。如果你使用 of,那就是“默认”模式,这意味着你的模式非常重要,你必须在你的 servlet 实现中满足“默认 Servlet”的规则。
url-pattern
url-pattern
/
resourceBase
- 使用单个以避免为每个上下文使用单独的对象/树/存储(这是由 Jetty 和 Servlet 规范强制执行的,不能被覆盖)。例如:您的上下文不能设置/查看/使用 from,反之亦然。
ServletContextHandler
HttpSession
/cts/delete
HttpSession
/cts
- 最后,将结果添加到 .
ServletContextHandler
ContextHandlerCollection
将所有建议放在一起,将其分解为一个(以避免 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>
评论