【问题标题】:trimFilter & UrlRewriteFilter causing IllegalStateExceptiontrimFilter 和 UrlRewriteFilter 导致 IllegalStateException
【发布时间】:2015-04-20 05:04:22
【问题描述】:

我正在使用 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] [levelValue: 900] [[ StandardWrapperValve[default]: Servlet.service() 用于 servlet 默认抛出异常 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.tukey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 在 org.tukey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 在 org.tukey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 在 org.tukey.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.tukey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213) 在 org.tukey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171) 在 org.tukey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 在 org.tukey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 在 org.tukey.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)

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

【问题讨论】:

    标签: java jsp servlets url-rewriting


    【解决方案1】:

    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>
    

    现在问题解决了。

    【讨论】:

      【解决方案2】:

      我认为您正在尝试将编写器放在一个地方,然后再将其输出流。 像 response.getWriter();在一处 和 response.getOutputStream();在另一个地方

      你不能同时使用它们。

      检查 javadocs,他们已经提到过。

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

      PrintWriter getWriter() 抛出 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.
      

      【讨论】:

      • 嗨 Milind,我已经知道原因了。我使用了 2 个无法访问其源代码的 .jar 文件。那就是问题所在。现在我已经摆脱了 1。
      猜你喜欢
      • 2014-06-19
      • 1970-01-01
      • 2017-03-15
      • 2012-05-09
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多