Captcha servlet导致java.lang.IllegalStateException:PWC3999:响应提交后无法创建会话

jl.*_*jl. 7 session captcha servlets glassfish simplecaptcha

我正在使用SimpleCaptcha创建CAPTCHA输入,并验证了Captcha输入.我使用以下代码创建了验证码输入.

HTML代码:

<form action="submit_proceed.do" method="post">
<img src="captchaImg" /><input type="text" name="captcha" value=""><br />
<input type="submit" value="Submit" name="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

JavaServlet代码:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Iterator;
import nl.captcha.Captcha;

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

List errorMsgs = new LinkedList();
try{
    // Validate Captcha
    HttpSession session = request.getSession(true);
    String userCaptcha = request.getParameter("captcha");
    Captcha captcha = (Captcha) session.getAttribute(Captcha.NAME);
    if (!captcha.isCorrect(userCaptcha)) {
        errorMsgs.add("Please input the correct Captcha value.");
    }
} catch (RuntimeException e) {
    errorMsgs.add("An unexpected error: " + e.getMessage());
    RequestDispatcher view = request.getRequestDispatcher("/error.view");
    view.forward(request, response);
}
Run Code Online (Sandbox Code Playgroud)

但是我一直收到这个错误:

StandardWrapperValve[Captcha]: PWC1406: Servlet.service() for servlet Captcha threw exception
java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed
Run Code Online (Sandbox Code Playgroud)

如何在servlet上创建会话?我该如何解决这个问题?

非常感谢你.

Bal*_*usC 16

提交响应后无法创建会话

异常消息非常清楚.有非法国家的手段.当响应已经提交时,您不能再设置/更改响应头.当标头已经发送到客户端时,将提交响应.这是一个不归路.

只要直接刷新(输入)输出流,就会提交响应.当您向响应写入超过2K(但依赖于服务器配置),或者flush()手动执行或进行sendRedirect()呼叫时,可能会发生这种情况.

每当需要创建会话时,服务器需要在响应头中设置cookie,以便它可以识别特定客户端并将其与HttpSession服务器内存中的实例相关联.但如果响应已经提交,那就不可能,因此这个例外.

回到这个问题的根本原因:

servlet Captcha的Servlet.service()引发了异常

它与该servlet servlet-nameCaptcha导致了这一问题.您需要检查/调试整个请求 - 响应链,以查看在servlet能够创建会话之前调用了哪些servlet /过滤器以及哪些servlet /过滤器可能已提交响应Captcha.我无法帮助您,因为您的主题启动中缺少此信息.

至少,在给定的代码示例中,我看到你不必要地调用response.getWriter().我不确定真实世界的代码是什么样的,也许你已经删除了一些行,但是你实际上可能正在写它并且这可能是问题的根本原因.如果你写得太多或者对它进行了刷新,那么将会提交resopnse.不要写这应该是一个控制器,一个Servlet中的响应.你通常在那里使用JSP.或者,如果是出于调试目的,请使用stdout(System.out.println())或Logger.