刷新数据时发生异常。这是什么意思,为什么会出现这种情况?

3
有一件有趣的事情正在发生。当我调用一个名为abc.com的url时,会寻址到一个servlet,但请求会经过一个过滤器(到达servlet)。从servlet中,我尝试将请求分派到一个jsp页面。但是,当我尝试分派请求时,会抛出一个异常:java.lang.IllegalStateException: Exception occurred when flushing data 过滤器代码
public class FirstSiteFilter implements Filter {
private FilterConfig fc;

@Override
public void init(FilterConfig config) throws ServletException {
    this.fc = config;
}

@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 
        throws ServletException,IOException {
    String IP = request.getRemoteAddr();
    request.setAttribute("client IP from the filter", IP);
    chain.doFilter(request, response);
}

@Override
public void destroy() {

}   
}

Servlet 代码(从过滤器链接到此servlet的请求)

public class FW_FirstSite extends HttpServlet {


@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String IP = (String)request.getAttribute("client IP from the filter");
    request.setAttribute("Client IP", IP);
    // THE FOLLOWING TWO STATEMENTS CAUSE AN EXCEPTION
    // IF I COMMENT THEM OUT NO EXCEPTION IS THROWN BUT AN EXCEPTION IS THROWN IF I LEAVE THEM AS IT IS
    RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
    rd.forward(request,response);
}
}

为什么我会收到这种异常?如果我在语句 request.setAttribute("client IP",IP) 后面加上语句response.sendRedirect("..."),它就能正常工作。
编辑(web.xml):
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
    <servlet-name>guestbook</servlet-name>
    <servlet-class>guestbook.GuestbookServlet</servlet-class>
</servlet>
<servlet>
    <servlet-name>emailtest</servlet-name>
    <servlet-class>Servlets.emailtest</servlet-class>
</servlet>
<servlet>
    <servlet-name>ValidateCredentials</servlet-name>
    <servlet-class>Servlets.ValidateCredentials</servlet-class>
</servlet>
<servlet>
    <servlet-name>UploadImagesToAisle</servlet-name>
    <servlet-class>Servlets.UploadImagesToAisle</servlet-class>
</servlet>
<servlet>
    <servlet-name>HandleSongLink</servlet-name>
    <servlet-class>Servlets.HandleSongLink</servlet-class>
</servlet>
<servlet>
    <servlet-name>context</servlet-name>
    <servlet-class>Servlets.context</servlet-class>
</servlet>
<servlet>
    <servlet-name>HandleVideoLink</servlet-name>
    <servlet-class>Servlets.HandleVideoLink</servlet-class>
</servlet>
<servlet>
    <servlet-name>HandlePoetry</servlet-name>
    <servlet-class>Servlets.HandlePoetry</servlet-class>
</servlet>
<servlet>
    <servlet-name>displaykey</servlet-name>
    <servlet-class>Servlets.displaykey</servlet-class>
</servlet>
<servlet>
    <servlet-name>tester_writeXML</servlet-name>
    <servlet-class>Servlets.tester_writeXML</servlet-class>
</servlet>
<servlet>
    <servlet-name>ShowBlob</servlet-name>
    <servlet-class>Servlets.ShowBlob</servlet-class>
</servlet>
<servlet>
    <servlet-name>FW_FirstSite</servlet-name>
    <servlet-class>Servlets.FW_FirstSite</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>guestbook</servlet-name>
    <url-pattern>/guestbook</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>sign</servlet-name>
    <servlet-class>guestbook.SignGuestbookServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>sign</servlet-name>
    <url-pattern>/sign</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>HandleSubmittedPoem</servlet-name>
    <servlet-class>Servlets.HandleSubmittedPoem</servlet-class>
</servlet>
<servlet>
    <servlet-name>HandleSubmittedMessage</servlet-name>
    <servlet-class>Servlets.HandleSubmittedMessage</servlet-class>
</servlet>
<servlet>
    <servlet-name>HandleSongDedicated</servlet-name>
    <servlet-class>Servlets.HandleSongDedicated</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HandleSubmittedPoem</servlet-name>
    <url-pattern>/HandleSubmittedPoem</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>HandleSubmittedMessage</servlet-name>
    <url-pattern>/HandleSubmittedMessage</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>HandleSongDedicated</servlet-name>
    <url-pattern>/HandleSongDedicated</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>emailtest</servlet-name>
    <url-pattern>/emailtest</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ValidateCredentials</servlet-name>
    <url-pattern>/ValidateCredentials</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>UploadImagesToAisle</servlet-name>
    <url-pattern>/UploadImagesToAisle</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>HandleSongLink</servlet-name>
    <url-pattern>/HandleSongLink</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>context</servlet-name>
    <url-pattern>/context</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>HandleVideoLink</servlet-name>
    <url-pattern>/HandleVideoLink</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>HandlePoetry</servlet-name>
    <url-pattern>/HandlePoetry</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>displaykey</servlet-name>
    <url-pattern>/displaykey</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>tester_writeXML</servlet-name>
    <url-pattern>/tester_writeXML</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ShowBlob</servlet-name>
    <url-pattern>/ShowBlob</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>FW_FirstSite</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>FirstSiteFilter</filter-name>
    <filter-class>Filters.FirstSiteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>FirstSiteFilter</filter-name>
    <servlet-name>FW_FirstSite</servlet-name>
</filter-mapping>



<!--
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
-->

</web-app>
1个回答

1

RequestDispatcher 总是需要一个斜杠。所以尝试将其更改为以下内容

RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");

当您使用RequestDispatcher.forward调用另一个servlet时,它是“命令链”。

当首次调用servlet时,响应对象是全新的:其标头尚未设置,其缓冲区为空,并且尚未向客户端写入任何数据。

但是,一旦状态代码或任何标头已被编写或可能被编写到客户端,或者数据已被编写或可能已被编写到正文流中,那么您可能会容易受到IllegalStateException错误的影响。此异常所发出的问题是您正在编写的新数据(或可能正在编写)与已经设置并不可逆地发送(“提交”)到客户端的数据不一致。

此异常的两个常见变体是“java.lang.IllegalStateException:Header already sent”和“java.lang.IllegalStateException:Cannot forward as Output Stream or Writer has already been obtained”。

“Header already sent”表示已将一个或多个标头提交给客户端,因此您无法再设置该标头。

“Output Stream或Writer已被获取”表示由于调用servlet已经调用了response.getWriter()或response.getOutputStream(),因此污染了数据流,因为响应已经被编写(或可能已经被编写),使其不适合转发。


仍然得到相同的异常。 - Suhail Gupta
你能添加你的web.xml文件的细节吗? - Chris
我应该做什么来避免它? - Suhail Gupta
拥有堆栈跟踪也会很棒。 - Lorand Bendig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接