包含 JSP 页面忽略自定义 headers

Include JSP page ignores custom headers

我有一个包含 JSP 页面和自定义 header:

的 servlet
    rsp.setStatus(HttpServletResponse.SC_OK);
    rsp.setContentType("text/html");
    rsp.addHeader("X-MyHeader", "Test");
    RequestDispatcher rd = req.getRequestDispatcher("MyPage.jsp");
    if ( rd != null )
        rd.include( req, rsp );

问题是,自定义 header 未包含在输出流中。

我了解包含的服务不能添加或更改 header,此类更改将被忽略,但在这种情况下,尝试添加 header 的不是包含的服务,而是执行包含的服务,它是被包含的 .jsp 页面而不是服务。

如何在外部服务中包含自定义 header(此处实际上只有一项服务)同时包含 .jsp 页面?

你看,JSP 页面被编码和编译为 Servlet。因此,JSP 页面基本上是伪装的 Servlet,因此通过调用它,您实际上重定向到另一个 Servlet。如果你想改变 JSP 中的 headers 你可以这样做:

<%
response.setHeader("X-MyHeader", "Test");
%>

如果您只想在原始 Servlet 中包含一些标记,我建议您存储在一个文本文件中,然后将文件的内容附加到 Servlet 的输出流中。

有两个问题在起作用。响应 header 没有出现在输出流中,因为服务已经通过 <jsp:include page=service...> 操作元素包含, 因为输出流编写器是在设置之前获得的header.

完整的原始 JSP 页面仅包含 3 行:

<%@ page contentType="text/html; charset=UTF-8">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:include page="/myservice"/>

如您所见,该页面包含随后执行的服务:

PrintWriter w = rsp.getWriter();
...
rsp.setStatus(HttpServletResponse.SC_OK);
rsp.setContentType("text/html");
rsp.addHeader("X-MyHeader", "Test");
RequestDispatcher rd = req.getRequestDispatcher("MyPage.jsp");
if ( rd != null )
    rd.include( req, rsp );

不仅有嵌套页面,而且一旦获取到输出流writer,Headers就无法更新了。任何一种情况都会导致问题。

有关详细信息,请参阅 Why can't HttpServletResponse Headers be updated AFTER getWriter() is called?

对我有用的解决方案是包含原始 JSP 页面中的 header(绕过这两个问题):

<%@ page contentType="text/html; charset=UTF-8">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% response.setHeader("X-MyHeader", "Test"); %>
<jsp:include page="/myservice"/>