我的web应用程序中有以下代码片段:
if (request.getParameter("user").equals("luke")||session == null && !(uri.endsWith("html") || uri.endsWith("LoginServlet"))) {
System.out.println("<<<----------denied------------->>>>");
pw.println("zzzzzzzzzz");
this.context.log("Unauthorized access request");
pw.flush();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//res.sendRedirect("login.html");
req.getRequestDispatcher("login.html").include(request,response);
} 当我在Forward()之前使用flush时,它抛出了IllegalStateException (因为响应是在我们调用flush的时候发送的,后来我们试图使用forward重新发送响应),但是即使在我在rd.include()之前提供了flush之后,代码仍然工作得很好。为什么不在这里抛出异常呢?
提亚
发布于 2014-09-05 02:22:26
在9.4章的forward方法和9.3章的include方法的Servlet Specification中解释了这种行为。
javadoc也详细解释了这一点。
HttpServletResponse#getWriter()状态的javadoc条目
在
PrintWriter上调用flush()提交响应。
提交响应意味着写入状态行和标头,并刷新缓冲区中响应体的任何部分。
javadoc of forward状态
将来自servlet的请求转发到服务器上的另一个资源(servlet、JSP文件或HTML文件)。此方法允许一个servlet对请求进行初步处理,并另一个资源以生成响应。
因此,forward to资源必须负责生成和提交响应。如果响应已经被提交,它就不能这样做。
javadoc of include状态
所包含的servlet不能更改响应状态代码或设置标头;任何更改尝试都将被忽略。
此方法只获取另一个资源的内容并将其写入响应。它不能对头或状态码做任何事情。因此,在提交之前或之后提交都没有区别。
发布于 2014-09-05 02:18:15
forward和include是不同的方法,include方法允许您向响应中添加内容,您在jsp中有一个include tag,include方法是相似的,但在服务器中。
forward方法将请求处理转移到另一个进程(servlet、jsp),且该进程必须更改响应,这就是您获得该异常原因,在转发响应之前不能更改响应。
您可以查看这些方法的文档here。
https://stackoverflow.com/questions/25671924
复制相似问题