Servlet的catch块调用response.sendRedirect抛出IllegalStateException如何解决
问题原因
你遇到的java.lang.IllegalStateException异常是Servlet处理重定向时的常见问题,核心触发逻辑是:调用response.sendRedirect()时,HTTP响应已经被提交到客户端,无法再修改响应头完成重定向操作。
你的代码里存在两个直接导致该问题的错误:
- 提前获取了响应输出流:你使用try-with-resources语法声明了
PrintWriter out = response.getWriter()资源,该语句会在进入try代码块时立即执行。只要调用response.getWriter()或response.getOutputStream()方法,容器就会标记响应已开始提交,后续再调用重定向方法修改响应头就会抛出非法状态异常。 - 冗余声明无用资源:你当前的业务代码完全没有用到声明的
out对象,属于不必要的资源获取操作。
修复方案
1. 移除无用的PrintWriter资源声明
直接删掉try代码块后的资源声明部分即可,不需要提前获取你用不到的输出流。
2. 重定向后增加return语句(可选优化)
避免重定向后还有后续代码执行,引发额外的响应操作冲突。
3. 增加响应状态判断(可选优化)
调用重定向前先通过response.isCommitted()判断响应是否已提交,避免触发异常。
修复后的代码示例
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, Exception { response.setContentType("text/html;charset=UTF-8"); RequestDAO requestDAO = new RequestDAOImpl(); try { // get request int rId = Integer.parseInt(request.getParameter("rId")); Request req = requestDAO.getRequestById(rId); sendDispatcher(request, response, "viewRequestMentor.jsp"); } catch (Exception e) { Logger.getLogger(ViewMentorRequestDetailController.class.getName()).log(Level.SEVERE, null, e); session.setAttribute("error", "Cant view request detail"); if (!response.isCommitted()) { response.sendRedirect("index.jsp"); } return; } }
内容的提问来源于stack exchange,提问作者ttgqwe456
相关产品推荐
相关产品推荐

