我不知道,但我觉得IllegalStateException导致撤消头痛。如果我有请求说JSP或其他servlet,并且需要将过滤器与该请求相关联。如果响应已经提交,我不能对客户端的输出做任何其他修改吗?
例如,我在JSP代码中看到将mimetype设置为response.setContent(“html”)然后我有一个与JSP关联的过滤器需要将mimetype设置为某个东西 其他。 setContent(“image”)或“xhtml”。但是我得到一个IllegalStateException?
是否有办法清除之前已提交的响应或有什么可以避免此问题。
这是在websphere上。
答案 0 :(得分:2)
我认为您需要重新考虑如何准备和回复您的回复。您无法写入响应(可能写入客户端),然后改变主意。
不考虑为什么你的解决方案必须改变返回类型的问题,我会写一些带有返回日期+类型的虚容器对象,并使其变为可变。只有在servlet完成所有工作后,才会将此对象(类型+内容)写入输出流。
(为了澄清,我认为servlet过滤器不是正确的方法。它们将拦截请求和响应,但响应填充是servlet的责任)
答案 1 :(得分:1)
我同意其他海报,这是丑陋的,但你可以在你的过滤器中创建一个HttpServletResponseWrapper,它会劫持输出并将该包装器传递给链而不是原始的响应对象。
答案 2 :(得分:0)
你的前提是执行一个jsp输出HTML,然后让一个过滤器将内容类型更改为像image这样的其他东西在同一个响应中是没有意义的。响应只能返回单个人工制品,无论是HTML文件还是图像。没有办法在同一个响应中返回 - 任何尝试这样做都是无稽之谈。发送一些带有图像二进制文件的HTML是没有意义的。内容类型用于整个响应。您无法在一个响应中打包多个thingos。
如果输出未超过buffersize,有时可以resetBuffer()。最好的方法是避免这种设施,并在开始输出响应之前去做什么。