过滤后RPC调用上的IllegalStateException

时间:2012-04-25 18:58:19

标签: gwt

我正在尝试为我的网页实施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(请求,响应);

我的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的教程/示例,我很乐意感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:2)

PrintWriter out = response.getWriter();

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

 * <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,可能带有自定义输出流或作家,以便其他人可以继续。