【问题标题】:Cannot forward after response has been committed in java servlet在 java servlet 中提交响应后无法转发
【发布时间】:2014-05-06 13:35:11
【问题描述】:

我有登录 JSP,它将重定向到名为 DisplayData 的 servlet,它必须检查用户凭据并仅为注册用户显示数据。但它会引发名为“响应提交后无法转发”的错误。这是servlet代码

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException
{
    HttpSession session = request.getSession(true);
    HttpSession usersession = request.getSession(true);
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    String query;
    Connection conn;
    Statement stmt;
    ResultSet res;
    DatabaseConnection dbconn;

    String username="";
    String hiddenname = request.getParameter("hiddenname");

    if (hiddenname.equals("login"))
    {
        username = request.getParameter("username");
        //System.out.println(username);
        String password = request.getParameter("password");
        // System.out.println(password);
        usersession.setAttribute("uname", username);
        usersession.setAttribute("upass", password);
        Connection con = dbconnection.getCon();
        System.out.println(con);
        PreparedStatement statemt = null;
        try {
            statemt = con.prepareStatement("select User_name,Password from login_details where User_name = ? and Password = ?");
            System.out.println(statemt);
            statemt.setString(1, username); // set input parameter 1
            statemt.setString(2, password); // set input parameter 2
            ResultSet rs = statemt.executeQuery();
            if (rs.next() == false)
            {
                out.write("Invalid user name or password. Please press back button to login again");

            }
            else
            {
                String url="/index.jsp";
                RequestDispatcher dispatcher=getServletContext().getRequestDispatcher(url);
                dispatcher.forward(request, response);
            }
            con.close();
        }
        catch (SQLException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    List lst=new ArrayList();
    String login_name,login_password;
    try
    {

        login_name=(String) session.getAttribute("uname");
        login_password=(String) session.getAttribute("upass");
        request.setAttribute("UserName", login_name);
        request.setAttribute("UserPassword", login_password);
        dbconn=new DatabaseConnection();
        conn=dbconn.setConnection();
        stmt=conn.createStatement();
        query="select * from mpi";
        res=dbconn.getResultSet(query, conn);
        while(res.next())
        {

            lst.add(res.getString("UniqueID"));
            lst.add(res.getString("Phylum"));
            lst.add(res.getString("Family"));
            lst.add(res.getString("Genus"));
            lst.add(res.getString("NCBI_Taxnomy_ID"));
            lst.add(res.getString("16s_Sanger_seq"));
            lst.add(res.getString("Genome_Sequencing_Batch"));
            lst.add(res.getString("Stock_number"));
            lst.add(res.getString("Stock_Location"));
            lst.add(res.getString("Soil_batch"));
            lst.add(res.getString("Host"));
            lst.add(res.getString("Operator"));
            lst.add(res.getString("GPS_coordinates"));
            lst.add(res.getString("Greenhouse_or_Natural_sites"));
            lst.add(res.getString("Isolation_procedure"));
            lst.add(res.getString("Date_of_isolation"));
            lst.add(res.getString("Previous_Ids"));
            lst.add(res.getString("Compartment"));
            lst.add(res.getString("Publication"));
            lst.add(res.getString("Strain_Derivatives"));
            lst.add(res.getString("Growth_conditions"));
            lst.add(res.getString("Natural_antibiotic_resistance"));
            lst.add(res.getString("Colony_morphology"));
        }
        res.close();
    }
    catch(Exception e)
    {
        RequestDispatcher rd=request.getRequestDispatcher("/error.jsp");
        rd.forward(request, response);
        e.printStackTrace();

    }
    finally
    {
        request.setAttribute("UserData", lst);
        RequestDispatcher rd=request.getRequestDispatcher("/displayrecord.jsp");
        rd.forward(request, response);
        lst.clear();
        out.close();
    }

}

我不知道错误在哪里。请帮助我。

【问题讨论】:

  • 你错过了 "if (hiddenname.equals("login"))" 条件中的 "else" 块。

标签: java jsp servlets


【解决方案1】:

您的代码中有几个转发。一个例子:

String url="/index.jsp";
RequestDispatcher dispatcher=getServletContext().getRequestDispatcher(url);
dispatcher.forward(request, response);

在代码的下方,您有一个带有try/catch/finally 的块。具体来说,你有块

finally
{
    request.setAttribute("UserData", lst);
    RequestDispatcher rd=request.getRequestDispatcher("/displayrecord.jsp");
    rd.forward(request, response);
    lst.clear();
    out.close();
}

当您转发请求时,它不会停止您方法中的执行。完成转发后,它将继续执行您离开的地方,并且您最终将通过 finally 块获得保证转发。无论您的代码前面发生了什么,finally 块都将被执行。如果您首先在代码顶部执行其中一个转发,那么当您点击 finally 块时它将失败,因为它会尝试第二次转发请求,这将导致您遇到的错误.

仔细查看您的完整堆栈跟踪,因为它应该指示它第二次尝试使用响应(在您的情况下是转发)的确切行号。您需要重新排列/重写您的代码,以便您只向前执行一个(最多)。

【讨论】:

  • 感谢您的建议。我检查了完整的堆栈,发现错误指向“if (hiddenname.equals("login"))”。问题是 servlet 代码根本不检查用户凭据,而是直接将 login.jsp 重定向到我不想要的 displayrecord.jsp。我希望 servlet 代码检查凭据,然后加载数据。
  • 您可能需要更仔细地查看您的finally 块。该块的本质作用是,无论代码前面发生了什么,它都会将您的请求转发给/displayrecord.jsp,并且从您的评论中我了解到您不希望这样。您可能应该将该块放在 if 语句中,而不是放在 finally 块中。还更新了答案以使其更加清晰。
  • 我发现了我的错误..在删除多个 response.redirect 并在 finally 块中只保留一个之后,我将用于显示数据库记录的代码的后半部分放入 else 块中,然后解决了问题..感谢您的建议
猜你喜欢
  • 2013-08-15
  • 2013-06-25
  • 2023-03-17
  • 2011-12-18
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2023-04-07
  • 2014-04-27
相关资源
最近更新 更多