在提交响应后获取不能callsendredirect()

时间:2013-03-11 07:13:48

标签: mysql jsp tomcat

我的问题再次与我正在为报告跟踪系统做的相同的项目有关,在访问重定向到“userloginmid.jsp”的登录页面后,在tomcat日志中获得以下错误。代码如下所示同一个窗口。

如果可能,请提供相同的解决方案。

<%@ page import="java.sql.*,java.util.*,java.text.*,java.text.SimpleDateFormat" %>
<%

  String userName = request.getParameter("userName");
  String password = request.getParameter("password");

    System.out.println("MySQL Connect Example.");
    Connection conn = null;
    String url = "jdbc:mysql://localhost:3306/";
    String dbName = "report_tracking";
    String driver = "com.mysql.jdbc.Driver";
    String username = "root"; 
    String userPassword = "root";

      java.util.Date now = new java.util.Date();
      String DATE_FORMAT = "yyyy-MM-dd hh:mm:ss";
      SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);

    String strDateNew = sdf.format(now) ;


    try {
      Class.forName(driver).newInstance();
      conn = DriverManager.getConnection(url+dbName,username,userPassword);
      Statement st = conn.createStatement();
      String strQuery = "select * from userregister where username='"+userName+"' and password='"+password+"'"; 
      out.println(strQuery);
      ResultSet rs = st.executeQuery(strQuery);

       if(rs.next())
        {

            int userid=rs.getInt(1);
            String user=rs.getString(2);

            session.setAttribute("userid",userid);
            session.setAttribute("username",user);
            session.setAttribute("intime",strDateNew);

            String queryString = "INSERT INTO admin set userid="+userid+",intime='"+strDateNew+"'";
            int i = st.executeUpdate(queryString);

            if(i>0)
            {
                response.sendRedirect("welcome.jsp");
            }

        }

        response.sendRedirect("login.jsp");
        conn.close();

    } catch (Exception e) {
      e.printStackTrace();
    }
 %> 

2 个答案:

答案 0 :(得分:0)

您的代码存在很多问题。

首先,解释你陈述的问题,在做出回应后重定向:

当HTTP标头已经发送到客户端时(如果您还不知道它,请阅读HTTP协议),它们已经关闭,无法撤回。您在jsp中对样本进行编码,这是您的架构的VIEW部分 - 至少在&#34;页面导入&#34;之间。并且代码部分有一个换行符,可能触发服务器将其缓冲区刷新到客户端。一旦完成,HTTP标头就会消失,您无法再重定向。

解决方法:不要在jsp中实现这个例程,而是在servlet中(或者使用一个适合你的问题来处理这个问题。任何一个当前的就足够了。)

现在谈谈您的代码存在的一些问题:

  • 请阅读SQL injection。想想有人发帖 用户名如someone'; someone' OR '0' = '0或类似名称(只是 让我们一起去吧)
  • 一旦获得连接并遇到任何错误,您就不会清理 连接(例如,你将在任何异常时泄漏连接)
  • 您似乎存储了明文密码。绝对是不行的 除了你以外的其他人将有一个帐户

答案 1 :(得分:0)

正如所有人所说,代码中有很多loopholes

但你问题的答案是

sendRedirect requires a return statement

因此,请将您的代码行更改为

response.sendRedirect( "welcome.jsp"); return;

response.sendRedirect("login.jsp"); return;

另请阅读this