我尝试配置一个jetty上下文(以编程方式)来使用服务于根上下文的servlet。
对于上下文路径,我设置“/”和servlet映射“/ *”。这完全按我想要的方式工作,但Jetty抱怨(警告)有关以'/'结尾的上下文路径。当我将上下文路径设置为“”(空字符串)时,它会导致关于空字符串的警告。
关于此问题的documentation section of Jetty说明:
请注意 Java Servlet Specification 2.5不鼓励空的上下文路径字符串,Java Servlet Specification 3.0有效地禁止它。
Jetty源的部分是:
public void setContextPath(String contextPath)
{
if (contextPath == null)
throw new IllegalArgumentException("null contextPath");
if (contextPath.endsWith("/*"))
{
LOG.warn(this+" contextPath ends with /*");
contextPath=contextPath.substring(0,contextPath.length()-2);
}
else if (contextPath.endsWith("/"))
{
LOG.warn(this+" contextPath ends with /");
contextPath=contextPath.substring(0,contextPath.length()-1);
}
if (contextPath.length()==0)
{
LOG.warn("Empty contextPath");
contextPath="/";
}
_contextPath = contextPath;
if (getServer() != null && (getServer().isStarting() || getServer().isStarted()))
{
Handler[] contextCollections = getServer().getChildHandlersByClass(ContextHandlerCollection.class);
for (int h = 0; contextCollections != null && h < contextCollections.length; h++)
((ContextHandlerCollection)contextCollections[h]).mapContexts();
}
}
所以问题是,我应该设置什么上下文路径才能映射到上下文的根。目前一切正常但是通过规范或Jetty警告设置了禁止的上下文路径,我想我需要一些不同的东西。
答案 0 :(得分:1)
文档说
上下文路径是用于选择的URL路径的前缀 传入请求的传递上下文。通常是一个URL 在Java servlet服务器中的格式 http://hostname.com/contextPath/servletPath/pathInfo,每个人 路径元素可以是零个或多个/分离的元素。 如果有的话 没有上下文路径,上下文被称为根上下文。 根上下文必须配置为“/”,但报告为 servlet API getContextPath()方法的空字符串。
所以,我猜你可以使用“/”。
http://www.eclipse.org/jetty/documentation/current/configuring-contexts.html
答案 1 :(得分:1)
我注意到(感谢@Ozan!)在设置上下文路径为“”的情况下使用“/”时,我试图添加一个bug请求。所以我认为这是一个错误,是的。此问题已存在bug report,它已在9.0.6中修复,自2013年9月30日起可用。因此,我刚刚升级了码头版本,警告现已消失。
Jetty代码现在检查路径的长度是否大于1:
public void setContextPath(String contextPath)
{
if (contextPath == null)
throw new IllegalArgumentException("null contextPath");
if (contextPath.endsWith("/*"))
{
LOG.warn(this+" contextPath ends with /*");
contextPath=contextPath.substring(0,contextPath.length()-2);
}
else if (contextPath.length()>1 && contextPath.endsWith("/"))
{
LOG.warn(this+" contextPath ends with /");
contextPath=contextPath.substring(0,contextPath.length()-1);
}
if (contextPath.length()==0)
{
LOG.warn("Empty contextPath");
contextPath="/";
}
_contextPath = contextPath;
if (getServer() != null && (getServer().isStarting() || getServer().isStarted()))
{
Handler[] contextCollections = getServer().getChildHandlersByClass(ContextHandlerCollection.class);
for (int h = 0; contextCollections != null && h < contextCollections.length; h++)
((ContextHandlerCollection)contextCollections[h]).mapContexts();
}
}