我有一个servlet,它的请求分配器包括另一个servlet。
包含的servlet设置了我想在 包含的 servlet中读取的标头。因此,我在include()方法中传入了一个自定义HTTPResponse对象,该对象捕获了Servlet中的所有反馈活动。
问题是没有在我的自定义响应中设置标题。我已经在debug中运行,并检查了Tomcat将我的自定义响应对象与自己的响应对象包装在一起的情况。setHeader调用转到该包装类,并且从不传播到我的自定义响应对象。
我想象Tomcat这样做是为了保护客户端,使其免受在错误位置设置标头的侵害。有趣的是,相同的方法可以按照我在Jetty中期望的方式工作。
自从我认真地完成Servlet以来已经有一段时间了,所以我在这里有些挣扎。我试图弄清楚如何从通过dispatcher.include()调用的servlet中读取响应标头。
从Servlet规范部分SRV.8.3:
RequestDispatcher接口的include方法可以随时调用。 include方法的目标servlet可以访问请求对象的所有方面,但是对响应对象的使用受到更多限制。
它只能将信息写入响应对象的ServletOutputStream或Writer并通过写入超出响应缓冲区末尾的内容或通过显式调用ServletResponse接口的flushBuffer方法来提交响应。
它不能设置标头或调用任何影响响应标头的方法。 任何这样做的尝试都 必须忽略 。
如何在请求范围内为调用servlet设置值request.setAttribute(...),然后在返回时从那里读取值?那行得通吗?
request.setAttribute(...)