0

Web ページに 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 ではありません。しかし、「送信」(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();

あなたの問題ですか - フィルター内のライターへの参照を取得している場合、サーブレット (または別のフィルター) がgetOutputStream()独自の作業を行うために使用しています。のjavadocから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

標準的なアプローチは、他のフィルター/サーブレットが書き込みを実行できない場合にのみ、ライター/出力ストリームを使用することです。これには、ゲッターの呼び出しも含まれます。チェーン内の後のフィルター/サーブレットも応答するかどうかに関係なく、常に何かを書きたい場合は、現在のresponseオブジェクトを のようなものでラップしHttpServletResponseWrapper、おそらくカスタム出力ストリームまたはライターを使用して、他の人が続行できるようにします。

于 2012-04-26T16:57:01.433 に答える