sendRedirect的问题。

kaohum 2012-08-31 05:58:28
做的是一个登录功能,前台是JSP页面,表单递交到一个servlet,奇怪的是提交的时候有可能会出现Cannot call sendRedirect() after the response has been committed错误;
有时候提交几十次都不会报错。有时候提交一次就报错。
代码:
servlet

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//String path = req.getContextPath() + "/";
String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort();
/** 登录 */
String username = req.getParameter("username");
String password = req.getParameter("password");
String yzcode = req.getParameter("yzcode");

if ("".equals(username) || username == null || "".equals(password) || password == null) {
req.getSession().setAttribute("error", "用户名或密码不能为空!");
//req.getRequestDispatcher("/login.jsp").forward(req, resp);
resp.sendRedirect(basePath + "/login.html");
return;
}


jsp:

<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
String error = (String) request.getSession().getAttribute("error");
String show = "";
if (error == null)
error = " ";
else
show = "khkmsg.show('errorContent','"+error+"',false)";
request.getSession().removeAttribute("error");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
...(以下都是HTML标签了)

第一次提交了,能显示错误信息,第二次就直接报错。试过用forward,一样的效果,搞不懂是怎么回事,求高手解答12。。
用forward提交大概10次之后才会报错。
...全文
13803 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
宁前道 2013-10-17
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
//注释掉下面的代码就没有这种错误了。
req.getSession().setAttribute("error", "用户名或密码不能为空!");
s478853630 2012-09-01
  • 打赏
  • 举报
回复
注意一点:
同一个线程中,response不能两次响应客户端
MiceRice 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
找到问题了。
是Kaptcha这个验证码控件搞的鬼。。
怎么会冲突呢。
[/Quote]

对Kaptcha没啥研究。。。不好意思,帮不了你了。。。
guyunfei2008 2012-08-31
  • 打赏
  • 举报
回复
找到问题了。
是Kaptcha这个验证码控件搞的鬼。。
怎么会冲突呢。
kaohum 2012-08-31
  • 打赏
  • 举报
回复
找到问题了。
是Kaptcha这个验证码控件搞的鬼。。
怎么会冲突呢。
kaohum 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
Cannot call sendRedirect() after the response has been committed
提示信息其实很清楚,如果response已经提交过了,就无法再发送sendRedirect了。

因为重定向,其实是HTTP-302,如果你之前已经写过数据,那么默认就是HTTP-200,浏览器都收到HTTP-Head信息了,就没机会做重定向了。


所以,……
[/Quote]

我知道啊。你说的这些我都注意了。过滤器只用了伪静态,但是我把伪静态取消掉,一样的会报错。
奇怪的是程序不是每次都报错。貌似是随机的。

jsp页面提交到servlet,servlet做好判断后返回给同一个jsp页面。流程是这样,但是多次提交后就会出错。
麻烦帮忙分析分析呗。~~要弄哭了。。。
MiceRice 2012-08-31
  • 打赏
  • 举报
回复
Cannot call sendRedirect() after the response has been committed
提示信息其实很清楚,如果response已经提交过了,就无法再发送sendRedirect了。

因为重定向,其实是HTTP-302,如果你之前已经写过数据,那么默认就是HTTP-200,浏览器都收到HTTP-Head信息了,就没机会做重定向了。


所以,在进行:
resp.sendRedirect()
之前,必须先保证没有任何的输出,包括:
1、Cookie;
2、resp.getWriter()写文本信息;
3、已经发送过重定向。


重点检查下这些问题吧,如果你写了Filter,或者Servlet已经做过forward,也要注意看看。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧