【问题标题】:wild card support in Embedded Jetty WebAppContextEmbedded Jetty WebAppContext 中的通配符支持
【发布时间】:2019-06-08 03:26:45
【问题描述】:

我在 Embedded Jetty WebAppContext contextPath 中寻找通配符支持,但无法解决。 我的购物网络应用程序有以下代码:

String path = "/shopping";
WebAppContext wac = new WebAppContext(WEBAPP_PATH, path);
contexts.addHandler(wac);

我希望如果访问 http://ip:port/shopping/anything,它应该加载我上面的 webapp。但事实并非如此。我也尝试过使用 path = "/shopping/*" ,但它也不起作用。
如果可能的话,这里的任何人都可以帮助我,或者我在这里做错了什么。

编辑:
我正在 Jetty 上部署一个 webapp(扁平化内容),并且可以使用 http://host:port/shopping 成功访问它。 为了实现这一点,我创建了一个 WebAppContext(wac),其中 webappPath 指向资源文件夹,上下文路径为 /shopping。我将此 wac 添加到处理程序列表并将其附加到服务器(码头服务器)。
现在,我想要的是使用http://host:port/shopping/ 访问这个网络应用程序。无论我在 url 购物后提供什么,我的同一个 webapp 都应该被加载。

更新: 进一步关注这一点,我在下面尝试了但没有成功。

ServletContextHandler 上下文 = 新 ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/shopping");
ServletHolder staticHolder = new ServletHolder(new DefaultServlet());
staticHolder.setInitParameter("resourceBase", webAppPath);
staticHolder.setInitParameter("pathInfoOnly", "true");
context.addServlet(staticHolder, "/*");
context.setWelcomeFiles(new String[] { "index.html", "index.htm", "index.jsp" });
contexts.addHandler(context);

现在,如果我尝试 /shopping,它可以工作,但 /shopping/abc 不能。通配符匹配似乎不起作用。如果我使用 /home 而不是 /,则 /shopping/home 有效。任何人都可以在这里帮助我。
我的要求是为任何 /shopping/
url 提供 weabAppPath 服务。

【问题讨论】:

  • 您只提供静态内容?没有servlet?没有过滤器?没有JSP?没有安全限制?没有 HttpSessions?
  • 是静态内容和仅 REST,没有 servlet 和 JSP。安全约束作为附加到服务器的单独处理程序存在。
  • REST 意味着您拥有动态内容,这意味着您拥有一个 servlet。这也意味着 Jetty 不提供静态内容,您的 REST 库是(典型的 Jersey 库)。
  • 不,Jetty 正在使用我的问题中提到的 org.eclipse.jetty.webapp.WebAppContext 提供静态上下文。 Jersey 使用 ServletContainer 提供 REST。
  • @JoakimErdfelt。我更新了这个问题。你现在能帮忙吗?

标签: java jetty embedded-jetty


【解决方案1】:

最后,我得到了它的工作。下面将为 /shopping 和 /shopping/anything/* 请求提供 webapp。

String path = "/shopping";   
WebAppContext wac = new WebAppContext(WEBAPP_PATH, path); 
contexts.addHandler(wac); 
wac.addServlet(new ServletHolder(new WebappServlet()), "/anything/*");

public class WebappServlet extends HttpServlet 
{    
    private static final long serialVersionUID = 1L;    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException     {               
        request.getRequestDispatcher("/index.html").forward(request, response);  
    }  
}

【讨论】:

    【解决方案2】:

    根据您的短代码 sn-p(实际上这里几乎没有什么可使用的),您的 WebAppContext 没有声明任何 servlet。

    不会调用 WebAppContext 中的任何内容来处理传入请求。

    WebAppContext 分配给context-path,其语法为/<path>context-path 中不支持通配符。

    您正在寻找的是 url-pattern 中的通配符支持,它只存在于 Servlet 和过滤器中。

    执行此操作,创建一个 ShoppingAnythingServlet 并将其设置为 /*url-pattern,然后您将获得对该新 Servlet 的所有请求。

    在该代码中,使用 HttpServletRequest.getPathInfo() 获取 /anything 是什么。

    【讨论】:

    • 感谢乔金姆的回复。这里没有 servlet。它只是从战争中加载 webapp index.html。看来我们不能将野车放在上下文路径中。
    • 有没有其他方法可以在通配符路径上加载 webapp。
    • 您对问题的描述不够充分。与其关注通配符或上下文路径或诸如此类的细节,不如描述(编辑您的问题)您试图实现的目标。实现该目标可能有一条完全不同的道路。
    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 2011-01-26
    • 2023-03-06
    • 2014-09-23
    • 2021-10-22
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多