我有一个过滤器,它实现了加载 servlet 和 JSP 的自定义约定。在该约定中,我使用以下代码来包含 servlet:
servletContext
.getRequestDispatcher( uriDispatcherLocator.getServletLocation( uri ) )
.include( request, response );
以及包含 JSP 的以下代码(在同一个过滤器中):
servletContext
.getRequestDispatcher( "/index.jsp" )
.include( request, response );
一切正常,servlet 执行,然后它包含 JSP 和一些不相关的自定义规则。如您所见,在我包含一个带有请求调度程序的 servlet 时,我无法向客户端发送 http 标头响应。问题是我希望 servlet 能够完全控制响应,就好像它是从过滤器内部调用的一样(因为过滤器只会根据项目文件系统中它们各自的 Class/JSP 位置动态映射 servlet )。我可以使用.forward()
而不是.include()
,但如果这样做,我将无法在 servlet 执行后包含 JSP。
那么,当通过 RequestDispatcher 接口通过过滤器包含时,我将如何允许 servlet 执行下面的代码?
response.sendRedirect( "/somePath" );
没有 Javascript 黑客,我愿意从服务器发送正确的 HTTP 响应以使浏览器正常运行。
--
编辑:换句话说:
我想通过使用 RequestDispatcher 更改从包含的 servlet INSIDE 发送到客户端的标头,但文档指出:
The included servlet cannot change the response status code or set headers; any attempt to make a change is ignored.