trimFilter & UrlRewriteFilter 导致 IllegalStateException

trimFilter & UrlRewriteFilter causing IllegalStateException

我正在使用 trimFilter (com.cj.trim.trimFilter) 去除在我的输出中创建的所有空行和空格,并使用 UrlRewriteFilter 执行 seo 友好的 URL。

很多页面工作正常,但有些会抛出以下异常 java.lang.IllegalStateException: 已经为此响应调用了 getWriter()

堆栈跟踪 [2015-02-19T00:06:49.718+0000] [glassfish 4.1] [警告] [] [javax.enterprise.web] [tid: _ThreadID=49 _ThreadName=jk_listener(1)] [timeMillis: 1424304409718 ] [级别值:900] [[ StandardWrapperValve[default]: Servlet.service() for servlet default throw exception java.lang.IllegalStateException: 已经为此响应调用了 getWriter() 在 org.apache.catalina.connector.Response.getOutputStream(Response.java:746) 在 org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:206) 在 javax.servlet.ServletResponseWrapper.getOutputStream(ServletResponseWrapper.java:142) 在 javax.servlet.ServletResponseWrapper.getOutputStream(ServletResponseWrapper.java:142) 在 com.cj.trim.trimFilter.doFilter(未知来源) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 在 org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 在 org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 在 org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 在 org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 在 org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:873) 在 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:739) 在 org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:575) 在 org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:546) 在 org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:428) 在 org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:378) 在 org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213) 在 org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171) 在 org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 在 org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 在 org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 在 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282) 在 com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 在 org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201) 在 org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175) 在 org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 在 org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 在 org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 在 org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561) 在 org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 在 java.lang.Thread.run(Thread.java:745)

我知道一个与另一个重叠。因此造成了这个问题。我需要知道如何解决这个问题。我应该在哪里更改代码来解决这个问题。

我认为您正试图将作者放在一个地方,然后再获取输出流。 喜欢 response.getWriter();在一个地方 和 response.getOutputStream();在另一个地方

不能同时使用。

查看javadocs,他们已经提到了。

http://docs.oracle.com/javaee/5/api/javax/servlet/ServletResponse.html#getWriter%28%29

PrintWriter getWriter() throws IOException

Returns a PrintWriter object that can send character text to the client. The PrintWriter uses the character encoding returned by getCharacterEncoding(). If the response's character encoding has not  been specified as described in getCharacterEncoding (i.e., the method  just returns the default value ISO-8859-1), getWriter updates it to ISO-8859-1.

Calling flush() on the PrintWriter commits the response.

Either this method or getOutputStream() may be called to write the body, not both.

trimFilter 和 UrlRewriteFilter 相互冲突,这就是它在某些 JSP 中不起作用的原因。

我所做的只是删除 trimFilter 并在 web.xml

中使用以下配置
   <jsp-config>
  <jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<trim-directive-whitespaces>true</trim-directive-whitespaces>
 </jsp-property-group>
</jsp-config>

现在问题解决了。