日期:2014-05-17  浏览次数:20714 次

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

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:
Java code

<%
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 = "&nbsp;";
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次之后才会报错。


------解决方案--------------------
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,也要注意看看。
------解决方案--------------------
注意一点:
同一个线程中,response不能两次响应客户端