在我们的 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()
似乎正确返回了 /
的上下文。有趣的是,即使我请求不同的 web 应用程序,它似乎也会这样做,但根据 Javadoc,我必须使用 getContext("/") 来确保我获得根上下文,所以我正在这样做。
获取调度程序也成功。
然后我调用 forward()
,这总是向客户端返回 404 响应。
如果我直接从网络浏览器访问 /sign_in
,则会加载表单。
服务器上只有两个上下文:根上下文 /
和我用来测试第二个 Web 应用程序的 /sample/
上下文。所以我知道 /sign_in
将位于根上下文中,但是为什么 forward()
在转发到它时给出 404 ?
最佳答案
关于java - 如何从 Jetty 处理程序转发到另一个 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11680531/