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-name的Captcha导致了这一问题.您需要检查/调试整个请求 - 响应链,以查看在servlet能够创建会话之前调用了哪些servlet /过滤器以及哪些servlet /过滤器可能已提交响应Captcha.我无法帮助您,因为您的主题启动中缺少此信息.
至少,在给定的代码示例中,我看到你不必要地调用response.getWriter().我不确定真实世界的代码是什么样的,也许你已经删除了一些行,但是你实际上可能正在写它并且这可能是问题的根本原因.如果你写得太多或者对它进行了刷新,那么将会提交resopnse.不要不写这应该是一个控制器,一个Servlet中的响应.你通常在那里使用JSP.或者,如果是出于调试目的,请使用stdout(System.out.println())或Logger.