【问题标题】:IllegalStateException on RPC Call after Filter过滤后 RPC 调用上的 IllegalStateException
【发布时间】:2012-05-06 12:22:40
【问题描述】:

我正在尝试为我的网页实现 AJAX 抓取。

为了感受一下,我用示例代码创建了一个新的 GWT 项目。

我创建了一个过滤器

public final class CrawlServlet implements Filter {
    @Override
      public void doFilter(ServletRequest request, ServletResponse response,
          FilterChain chain) throws IOException {

    PrintWriter out = response.getWriter();

    if (request.toString().contains("_escaped_fragment=")) {
        out.write("yo");
    } else {
        try {
            chain.doFilter(request, response);
            return;
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }
  }`

如果浏览此站点,我会得到正确的响应:http://127.0.0.1:8888/URLFilter.html?gwt.codesvr=127.0.0.1:9997?_escaped_fragment=key=#!yo 如果我的 URL 不是 escaped_fragment,我会看到 GWT 示例应用程序。但是当我点击“发送”(调用 RPC)时,我得到了 IllegalStatementException。

[WARN] Exception while dispatching incoming RPC call
java.lang.IllegalStateException: WRITER

at test.server.CrawlServlet.doFilter(CrawlServlet.java:32)

(这是chain.doFilter(request, response);

我的 web.xml

 <!-- Servlets --> 

 <filter>
    <filter-name>crawlServlet</filter-name>
    <filter-class>test.server.CrawlServlet</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>crawlServlet</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


  <servlet>
    <servlet-name>greetServlet</servlet-name>
    <servlet-class>test.server.GreetingServiceImpl</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>greetServlet</servlet-name>
    <url-pattern>/urlfilter/greet</url-pattern>
  </servlet-mapping>

由于我在 GWT 中没有找到太多关于过滤器/rpc 的教程/示例,因此我很高兴获得任何帮助。

谢谢

【问题讨论】:

    标签: gwt


    【解决方案1】:
    PrintWriter out = response.getWriter();
    

    您的问题是 - 您在过滤器中获得了对作者的引用,然后 servlet(或另一个过滤器)正在使用 getOutputStream() 来完成自己的工作。来自getWriter 的 javadocs:

     * <p>Either this method or {@link #getOutputStream} may be called
     * to write the body, not both.
    

    ...

     * @exception IllegalStateException
     *          if the <code>getOutputStream</code>
     *          method has already been called for this 
     *          response object
    

    标准方法是仅在没有其他过滤器/servlet 可以进行任何写入时才使用写入器/输出流 - 这甚至包括调用 getter。如果您总是想写一些东西,无论链中的后续过滤器/servlet 是否也会响应,然后将当前的response 对象包裹在类似HttpServletResponseWrapper 的东西中,可能使用自定义输出流或写入器,以便其他人可以继续。

    【讨论】:

    • 感谢您的帮助。我找到了这个example。现在我看到演员解决了这个问题。
    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多