在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()
似乎正确地返回了/
的上下文。有趣的是,即使我请求不同的网络应用程序,它似乎也会这样做,但根据Javadoc的说法,我必须使用getContext("/")
来确保我得到根上下文,所以我正在这样做。
获取调度程序也成功。
然后我调用forward()
,这总是向客户端返回404响应。
如果我直接从web浏览器转到/sign_in
,则会加载表单。
服务器上只有两个上下文:根上下文/
和用于测试第二个Web应用程序的/sample/
上下文。所以我知道/sign_in
会在根上下文中,但为什么forward()
在转发给它时会给出404?
结果是一个错误。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=386359