如何从Jetty处理程序转发到另一个URL?

时间:2012-07-27 02:06:34

标签: java jetty handlers

在我们的servlet过滤器链中,有一个过滤器会在发送401错误时将请求转发到登录页面,作为可用性调整。

我正在尝试将其转换为Jetty处理程序,因为有人希望所有Web应用程序都使用相同的逻辑进行身份验证,而不是每个必须实现自己身份验证的Web应用程序。

(我们首先使用过滤器方法的主要原因是没有人能够让Jetty的容器级身份验证完全正常工作 - 我们可以选择Windows身份验证或内置身份验证并且想要能够在运行时在这些之间切换,并且永远无法弄清楚如何使用Jetty工作。)

在Jetty处理程序中,有一些这样的逻辑:

private void handleErrorBetter(HttpServletRequest servletRequest,
                               HttpServletResponse servletResponse)
        throws ServletException, IOException {
    if (isPageRequest(servletRequest)) {
        ServletContext rootContext = servletRequest.getServletContext().getContext("/");
        RequestDispatcher dispatcher = rootContext.getRequestDispatcher("/sign_in");
        dispatcher.forward(servletRequest, servletResponse);
    } else {
        // ...
    }
}

servletRequest.getServletContext()似乎正确返回/的上下文。有趣的是,即使我请求不同的webapp,它似乎也会这样做,但根据Javadoc,我必须使用getContext("/")来确保我获得根上下文,所以我正在这样做。

让调度员也成功。

然后我调用forward(),这总是会向客户端返回404响应。

如果我直接从网络浏览器转到/sign_in,表单会加载。

服务器上只有两个上下文:根上下文/,以及我用来测试第二个webapp的/sample/上下文。所以我知道/sign_in将在根上下文中,但为什么forward()在转发给它时会给出404?

1 个答案:

答案 0 :(得分:3)