1

我尝试配置一个码头上下文(以编程方式)以使用服务于根上下文的 servlet。

对于我设置“/”的上下文路径和 servlet 映射“/*”。这完全按照我想要的方式工作,但 Jetty 抱怨(警告)上下文路径以“/”结尾。当我将上下文路径设置为“”(空字符串)时,会导致有关空字符串的警告。

Jetty 关于此问题的文档部分指出:

请注意
,Java Servlet 规范 2.5 不鼓励空的上下文路径字符串,而 Java Servlet 规范 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();
    }
}

所以问题是,为了映射到上下文的根,我应该设置什么上下文路径。目前一切正常,但是通过规范或码头警告设置了禁止的上下文路径,我想我需要一些不同的东西。

4

2 回答 2

2

文档说

上下文路径是 URL 路径的前缀,用于选择传入请求传递到的上下文。通常,Java servlet 服务器中的 URL 的格式为 http://hostname.com/contextPath/servletPath/pathInfo,其中每个路径元素可以是零个或多个/分隔的元素。如果没有上下文路径,则该上下文称为根上下文。根上下文必须配置为“/”,但被 servlet API getContextPath() 方法报告为空字符串。

所以,我想你可以使用"/"

http://www.eclipse.org/jetty/documentation/current/configuring-contexts.html

于 2013-11-04T13:29:34.243 回答
1

在我注意到(感谢@Ozan!)在将上下文路径设置为“”的情况下使用“/”之后,我尝试为此添加错误请求。所以我认为这是一个错误,是的。此问题已存在错误报告,并已在 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();
    }
}
于 2013-11-04T14:02:00.653 回答