0

我正在尝试为我的网页实现 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 如果我的,我会看到 GWT 示例应用程序URL 不是 escaped_fragment。但是当我点击“发送”(调用 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 的教程/示例,我很乐意感谢任何帮助。

谢谢

4

1 回答 1

2
PrintWriter out = response.getWriter();

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

 * <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对象包装在类似 a 的东西中HttpServletResponseWrapper,可能带有自定义输出流或编写器,以便其他人可以继续。

于 2012-04-26T16:57:01.433 回答