有一些有趣的事情发生了。当我调用url abc.com 时,会解决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);
}
}
为什么我得到这种类型的例外?相反,如果我将语句response.sendRedirect("...")
放在语句request.setAttribute("client IP",IP)
之后就可以了。
编辑(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>
答案 0 :(得分:1)
RequestDispatcher始终需要正斜杠。因此,请尝试将其更改为以下
RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
当您使用RequestDispatcher.forward调用另一个servlet时,它是“命令链”。
首次调用servlet时,响应对象是新的和新的:它的头文件尚未设置,其缓冲区为空,并且没有数据写入客户端。
但是,只要状态代码或任何标题已写入或可能已写入客户端,或者数据已经 - 或可能已 - 写入正文流,那么你可能容易受到IllegalStateException错误的影响。此异常发出信号的问题是您(或可能)写入的新数据与已设置的数据不一致,然后无可挽回地发送(“已提交”)到客户端。
此异常的两个常见变体是“java.lang.IllegalStateException:Header already sent”和“java.lang.IllegalStateException:无法转发,因为已经获得了输出流或写入器”。
“已发送标头”表示已将一个或多个标头提交给客户端,因此您无法再次设置该标头。
“已经获得输出流或写入器”意味着由于调用servlet已经调用了response.getWriter()或response.getOutputStream(),这会污染数据流,因为响应已经(或可能已经)写入已经,使其不适合转发。