【发布时间】:2013-05-19 14:33:05
【问题描述】:
我有一个过滤器,它实现了加载 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 hack,我愿意从服务器发送正确的 HTTP 响应以使浏览器正常运行。
--
编辑: 换句话说:
我想使用 RequestDispatcher 更改从 INSIDE 包含的 servlet 发送到客户端的标头,但文档指出:
The included servlet cannot change the response status code or set headers; any attempt to make a change is ignored.
【问题讨论】:
-
如果要发送重定向,则无法呈现 jsps。我可能误解了您要实现的目标。
-
您可以在 servlet 中抛出异常来指示过滤器进行重定向。不是最优雅的解决方案,但至少重定向的决定可以保留在 servlet 中......
-
@SotiriosDelimanolis 我将 servlet 内容包含在响应中。我想包含 servlet,能够操作标头并包含带有过滤器的 jsp。
-
@SirRotN 我不想只是重定向。有时应该需要以某种方式操作标头,因此我不能为每种行为创建一个异常类型(尽管这有点道理)
标签: java servlets servlet-filters