【问题标题】:Cannot forward after response has been committed - Servlet提交响应后无法转发 - Servlet
【发布时间】:2013-06-25 12:47:58
【问题描述】:

我正在尝试从 HTTPSession 注销并将用户重定向到登录页面。

下面是我完整的 Http servlet 代码。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LogoutServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{
    super.doGet(req, resp);
    processRequest(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{
    super.doPost(req, resp);
    processRequest(req, resp);
}

private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    final HttpSession session = request.getSession(false);
    if (session != null) 
    {
        session.invalidate();
    }

    response.sendRedirect("/login.html");
    //getServletContext().getRequestDispatcher("/login.html").forward(request, response);
}

}

但得到以下异常:

java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:339)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
at com.controller.LogoutServlet.processRequest(LogoutServlet.java:41)

【问题讨论】:

  • 从调用 processRequest() 的位置发布 servlet 的代码
  • @RaviThapliyal:用完整代码修改了上述问题。

标签: java servlets


【解决方案1】:

删除调用

super.doGet(req, resp); // and
super.doPost(req, resp);

基类实现只是尝试抛出不支持 GET 或 POST 的错误消息。

// HttpServlet#doGet() calls
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);

以上行是已经提交响应的内容。

【讨论】:

  • 太棒了,效果很好。有什么特殊原因必须删除它吗?
  • 这是 RequestDispatcher.forward(ServletRequest req, ServletResponse resp) 方法描述的一部分:“转发应该在响应提交给客户端之前调用(在刷新响应正文输出之前)。如果响应已经被提交,这个方法抛出一个 IllegalStateException。响应缓冲区中未提交的输出在转发之前被自动清除。您正在通过这些超级调用提交响应
【解决方案2】:

你为什么不重定向而不是转发?

    response.sendRedirect("/login.html");

【讨论】:

  • 如果我重定向以下是我得到的异常: java.lang.IllegalStateException org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:473) com.controller.LogoutServlet.processRequest(LogoutServlet .java:41) com.controller.LogoutServlet.doGet(LogoutServlet.java:23) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722 )
猜你喜欢
  • 2013-08-15
  • 2023-03-17
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2015-01-27
  • 2013-09-15
相关资源
最近更新 更多