【问题标题】:servlet url mappingservlet url 映射
【发布时间】:2012-01-20 23:53:32
【问题描述】:

我有两个 servlet(MainServlet 和 LoginServlet),MainServlet 处理所有请求并将其映射到 /* 。 LoginServlet 处理请求并将其映射到 /login。我有一个 html 文件 /html/login.html。现在我想在点击 http://localhost:8080/app/login 时显示这个 html 文件。

在LoginServlet doGet 方法中我正在做httpServletRequest.getRequestDispatcher("login/login.html").include(httpServletRequest, httpServletResponse);

但是这个重定向请求到MainServlet。我无法将 MainSerlvet 的 url 映射从 /* 更改为其他内容。

任何想法我可以如何实现上述目标? PS:如果问题不清楚,请告诉我。

【问题讨论】:

  • 您指出您的 html 文件位于“/html/login.html”,但看起来您正在获取“login/login.html”的请求调度程序。这是您的问题中的错字吗?否则,这可能至少代表了部分问题。

标签: jakarta-ee servlets servlet-filters


【解决方案1】:

您已将 MainServlet 映射到全局 URL 模式 /* 上,这对于 servlet 来说是一种非常糟糕的做法(这也包括 CSS/JS/images/等静态资源!)。这也将拦截所有转发和包含的请求。您需要将MainServlet 映射到更具体的 URL 模式,例如/main/*、/app/* 或类似的东西并创建一个映射到/* 的Filter 并将所有非/login 请求转发到MainServlet。

String uri = ((HttpServletRequest) request).getRequestURI();

if (uri.startsWith("/login/")) {
    // Just continue to login servlet.
    chain.doFilter(request, response);
} else {
    // Forward to main servlet.
    request.getRequestDispatcher("/main" + uri).forward(request, response);
}

顺便说一句,使用RequestDispatcher#include() 显示视图也不完全正确。您应该为此使用 RequestDispatcher#forward()。

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 2018-11-24
    • 2011-07-09
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多