【问题标题】:Include JSP page ignores custom headers包含 JSP 页面忽略自定义标题
【发布时间】:2015-01-27 19:19:48
【问题描述】:

我有一个包含 JSP 页面和自定义标题的 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 );

问题是,自定义标头没有包含在输出流中。

我了解包含的服务无法添加或更改标头,此类更改会被忽略,但在这种情况下,尝试添加标头的不是包含服务,而是执行包含的服务,它是一个 .jsp 页面这不是服务。

如何在外部服务中包含自定义标头(这里实际上只有一个服务),同时还包含 .jsp 页面?

【问题讨论】:

  • 这是完全合法的。

标签: java jsp tomcat servlets


【解决方案1】:

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

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

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

【讨论】:

  • 不幸的是,这不起作用。由于 JSP 页面基本上是一个变相的 servlet,我不希望它能够工作。据记载,包含的 servlet 不能添加或更改标头。但是,在我的原始代码中,添加标头的不是包含的 servlet,而是包含的 servlet;在这种情况下,文档清楚地表明调用者的响应保持不变。那么我的自定义标头在哪里?
  • 然后用 request.getRequestDispatcher(jsp).forward(request, response); 调用你的 JSP;
  • 不高兴。那也没用。自定义标题坚决拒绝出现。如果我不使用 RequestDispatcher 包含/转发页面,则会出现自定义标题。一旦我调用 RequestDispatcher 方法,标头就会丢失。
  • 原来有一个 index.jsp 包含来自服务的数据,该服务随后包含一个 jsp 页面。这解释了为什么服务本身无法设置标头,因为它是包含的目标。此外,我将 放在最里面的 jsp 中,而不是 index.jsp 中。当然,放置得当,效果很好。
  • 太棒了!了解应用程序的流程始终很重要。
【解决方案2】:

有两个问题在起作用。响应标头没有出现在输出流中,因为服务已经通过 &lt;jsp:include page=service...&gt; 操作元素包含,因为在设置标头之前获得了输出流写入器。

完整的原始 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 );

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

更多信息请参见Why can't HttpServletResponse Headers be updated AFTER getWriter() is called?

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

<%@ 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"/>

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多