首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修复方法:响应提交后无法调用sendRedirect()

修复方法:响应提交后无法调用sendRedirect()
EN

Stack Overflow用户
提问于 2020-11-04 02:55:25
回答 2查看 294关注 0票数 0

当我试图通过jsp页面传递值时,我得到了这个错误:

代码语言:javascript
运行
复制
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
    org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:482)
    org.KeyGeneration.doPost(KeyGeneration.java:133)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

这是它的代码:

代码语言:javascript
运行
复制
 package org;

import java.io.IOException;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.ECGenParameterSpec;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Random;
import javax.crypto.KeyAgreement;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebServlet(name = "KeyGeneration", urlPatterns = {"/keyGeneration"})
public class KeyGeneration extends HttpServlet {

    Connection con = null;
    PreparedStatement pst = null;
    ResultSet rst = null;
    String userid = null;
    String secretekey = null;
    String secretU = null;
    String secretV = null;
    String email = null;
    int otp = 0;
    String host = "smtp.gmail.com";
    String port = "587";
    String userName = "emailID";
    String password = "emailPass";

    int i = 0;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        HttpSession session = request.getSession(true);
        //connection from database
        try {
            con = connection.dbConnection.makeConnection();
        } catch (Exception e) {
        }

        userid = request.getParameter("userid");
        secretekey = request.getParameter("secretkey");

        //Generation ECC Key Agreement
        try {
            KeyPairGenerator kpg;
            kpg = KeyPairGenerator.getInstance("EC", "SunEC");
            ECGenParameterSpec ecsp;
            //String parameter = "sect113r2";
            ecsp = new ECGenParameterSpec(secretekey);
            kpg.initialize(ecsp);
            KeyPair kpU = kpg.genKeyPair();
            PrivateKey privKeyU = kpU.getPrivate();
            PublicKey pubKeyU = kpU.getPublic();            
            KeyPair kpV = kpg.genKeyPair();
            PrivateKey privKeyV = kpV.getPrivate();
            PublicKey pubKeyV = kpV.getPublic();
            KeyAgreement ecdhU = KeyAgreement.getInstance("ECDH");
            ecdhU.init(privKeyU);
            ecdhU.doPhase(pubKeyV, true);
            KeyAgreement ecdhV = KeyAgreement.getInstance("ECDH");
            ecdhV.init(privKeyV);
            ecdhV.doPhase(pubKeyU, true);
            secretU = new BigInteger(1, ecdhU.generateSecret()).toString(16).toUpperCase();
            secretV = new BigInteger(1, ecdhV.generateSecret()).toString(16).toUpperCase();

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

        //Generate  random no
        Random rand = new Random();
        otp = rand.nextInt((999999 - 100000) + 1) + 100000;

        try {
            String query = "SELECT email FROM users WHERE userid = '" + userid + "' AND u_status = '1'";
            pst = con.prepareStatement(query);
            rst = pst.executeQuery();
            if (rst.next()) {
                email = rst.getString(1);
                String subject = "OTP from Secure Cloud using ECC";
                String message = "Your OTP is " + otp;
                //Send email
                try {
                    EmailUtility.sendEmail(host, port, userName, password, email, subject,
                            message);
                    // resultMessage = "The e-mail was sent successfully";
                } catch (Exception ex) {
                    ex.printStackTrace();
                    //resultMessage = "There were an error: " + ex.getMessage();
                }

            } else {
                session.setAttribute("MSG", "Secret key has not been generated.");
                response.sendRedirect("keyexchange.jsp?userid=" + userid);
            }
        } catch (Exception e) {
        }

        try {
            String sqlquery = "update users set user_key=?,secretu=?,user_otp=? where userid = '" + userid + "'";
            pst = con.prepareStatement(sqlquery);
            pst.setString(1, secretekey);
            pst.setString(2, secretU);
            pst.setInt(3, otp);
            i = pst.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //success or failure message
        if (i > 0) {
            session.setAttribute("MSG", "ECDH Key agreement has been successfully generated.");
            response.sendRedirect("secretkey.jsp?userid=" + userid + "&secretkey=" + secretU);
        } else {
            session.setAttribute("MSG", "Secret key has not been generated.");
            response.sendRedirect("keyexchange.jsp?userid=" + userid);
        }

    }

}

有谁能帮帮我吗?我是美国人。

EN

回答 2

Stack Overflow用户

发布于 2020-11-04 03:18:01

问题可能是您多次调用response.sendRedirect,请尝试更改以下内容:

代码语言:javascript
运行
复制
            } else {
                session.setAttribute("MSG", "Secret key has not been generated.");
                response.sendRedirect("keyexchange.jsp?userid=" + userid);
            }
        } catch (Exception e) {
        }

要这样做:

代码语言:javascript
运行
复制
            } else {
                session.setAttribute("MSG", "Secret key has not been generated.");
                response.sendRedirect("keyexchange.jsp?userid=" + userid);
                return;
            }
        } catch (Exception e) {
        }
票数 0
EN

Stack Overflow用户

发布于 2020-11-04 03:31:45

servlet不能多次使用redirect指令进行响应。尝试这样做将导致您遇到的错误。在执行以下代码行之后

代码语言:javascript
运行
复制
response.sendRedirect("keyexchange.jsp?userid=" + userid);

您的代码将继续执行以下行

代码语言:javascript
运行
复制
try {
    String sqlquery = "update users set user_key=?,secretu=?,user_otp=? where userid = '" + userid + "'";
    pst = con.prepareStatement(sqlquery);
    //....
} catch (Exception e) {
    e.printStackTrace();
}
//success or failure message
if (i > 0) {
    session.setAttribute("MSG", "ECDH Key agreement has been successfully generated.");
    response.sendRedirect("secretkey.jsp?userid=" + userid + "&secretkey=" + secretU);
} else {
    session.setAttribute("MSG", "Secret key has not been generated.");
    response.sendRedirect("keyexchange.jsp?userid=" + userid);
}

因此再次遇到response.sendRedirect

这是一个设计问题。您可以将一条return语句放在第一个response.sendRedirect之后,但这会使后面的代码失效。

你可以通过使用一些变量来解决这个问题。

代码语言:javascript
运行
复制
boolean redirect = false;

try {
    String query = "SELECT email FROM users WHERE userid = '" + userid + "' AND u_status = '1'";
    //...
    if (rst.next()) {
        //...
    } else {
        redirect = true;
    }
} catch (Exception e) {
    e.printStackTrace();
}

try {
    String sqlquery = "update users set user_key=?,secretu=?,user_otp=? where userid = '" + userid + "'";
    //...
} catch (Exception e) {
    e.printStackTrace();
}

//success or failure message
if (i > 0) {
    session.setAttribute("MSG", "ECDH Key agreement has been successfully generated.");
    response.sendRedirect("secretkey.jsp?userid=" + userid + "&secretkey=" + secretU);
} else if (redirect) {
    session.setAttribute("MSG", "Secret key has not been generated.");
    response.sendRedirect("keyexchange.jsp?userid=" + userid);
}

这将确保response.sendRedirect只被调用一次。

Alternatively,您可以完全删除以下代码块的第一次出现,因为它在我看来是不必要的。

代码语言:javascript
运行
复制
else {
    session.setAttribute("MSG", "Secret key has not been generated.");
    response.sendRedirect("keyexchange.jsp?userid=" + userid);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64668877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档