1

我的网络应用程序中有以下代码片段:

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(). 为什么它不在这里抛出异常?

TIA

4

2 回答 2

1

此行为在Servlet 规范中对forward第 9.4 章中的include方法和第 9.3 章中的方法进行了解释。

javadoc 也稍微详细地解释了这一点。

HttpServletResponse#getWriter()状态的 javadoc 条目

调用flush()提交PrintWriter响应。

提交响应意味着写入状态行和标头并刷新缓冲区中响应主体的任何部分。

各州的javadocforward

将来自 servlet 的请求转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件)。此方法允许一个 servlet 对请求进行初步处理,并允许另一个资源生成响应。

因此,转发到资源必须负责生成和提交响应。如果响应已经提交,它就不能这样做。

各州的javadocinclude

包含的 servlet 不能更改响应状态码或设置标头;任何进行更改的尝试都会被忽略。

此方法只是获取另一个资源的内容并将其写入响应。它不能对标题或状态代码做任何事情。因此,在之前或之后提交没有区别。

于 2014-09-04T18:22:26.257 回答
0

forward和是不同的include方法,include 方法允许您向响应中添加内容,您include tag在 jsp 中有一个,include 方法类似但在服务器中。

forward方法将请求处理转移到另一个进程(servlet,jsp)并且该进程必须更改响应,这就是您得到该异常的原因,您不能在转发之前更改响应。

您可以在此处查看这些方法的文档。

于 2014-09-04T18:18:15.267 回答