我正在尝试为我的网页实施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的教程/示例,我很乐意感谢任何帮助。
由于
答案 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
,可能带有自定义输出流或作家,以便其他人可以继续。