Servlet with java.lang.IllegalStateException:在提交响应后无法转发 [英] Servlet with java.lang.IllegalStateException: Cannot forward after response has been committed

查看:188
本文介绍了Servlet with java.lang.IllegalStateException:在提交响应后无法转发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的servlet中我有这段代码:

In my servlet I have this code:

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub

    Utils.CheckSession(request,response);

    String op = request.getParameter("op");
    int DaysToAdd = request.getParameter("daysToAdd") != null ? Integer.valueOf(request.getParameter("daysToAdd")) :  0;

    ArrayList<Giorno> giorni = new ArrayList<Giorno>();

    /*HERE I FILL ArrayList giorni and calculate other variables*/


    if ("cal".equals(op))
    {
        request.setAttribute("giorni", giorni);
        request.setAttribute("daysToAdd", DaysToAdd);
        request.getRequestDispatcher("GestioneCalendario.jsp").forward(request, response);

    }
    else if("utente".equals(op))
    {
        // ricavare abbonamento dell'utente
        String idu = (String) request.getAttribute("idu");
        Abbonamento a = null;
        int iDa = Utils.getIdAbbonamentoAttivoUtente(idu);
        a = Utils.getAbbonamentoFromId(iDa);
        request.setAttribute("abbonamento", a);
        request.getRequestDispatcher("Lezioni.jsp").forward(request, response);

    }
    else
    {
        request.setAttribute("giorni", giorni);
        request.setAttribute("daysToAdd", DaysToAdd);       
        request.getRequestDispatcher("GestioneLezioniNuovoLayout.jsp").forward(request, response);

    }

}

也许是问题在方法CheckSession ??

Maybe the problem is in the method CheckSession??

public static void CheckSession(HttpServletRequest request,
        HttpServletResponse response) {
    // TODO Auto-generated method stub
     HttpSession session = request.getSession(true);
     String logged = null;
     if (session!=null)
          logged = (String) session.getAttribute("logined");
     if(logged == null)
     {
         request.setAttribute("errore", "Devi loggarti!");
        try {
            request.getRequestDispatcher("Admin.jsp")
            .forward(request, response);
            return;
        } catch (ServletException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
     }

但它给了我这个例外:

GRAVE: Servlet.service() for servlet [TakeDates] in context with path [/Spinning] threw     exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:349)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
at servlet.TakeDates.doGet(TakeDates.java:368)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)

使用此URL调用servlet

the servlet is called with this url

http://localhost:8080/Spinning/TakeDates?op=cal

任何人都可以帮助我吗?提前谢谢!

Anyone can help me? thanks in advance!

推荐答案

在代码中的某处,您已经对响应对象做出了一些响应。

Somewhere in your code you have committed some response to the response object.

在将任何输出提交到响应之前,您必须发送到 jsp 页面对象

You have to dispatch to your jsp page before you commit any output to the response object.

来自文档


转发应被调用在将响应提交到
客户端之前(在刷新响应正文输出之前)。如果响应
已经提交,则此方法抛出
IllegalStateException。响应缓冲区中未提交的输出是
在转发之前自动清除。

forward should be called before the response has been committed to the client (before response body output has been flushed). If the response already has been committed, this method throws an IllegalStateException. Uncommitted output in the response buffer is automatically cleared before the forward.

问题是你要转发给管理员你应该在 Utils.CheckSession 方法中重定向的.jsp页面

The problem is that you are forwarding to the admin.jsp page when you should be redirecting in the Utils.CheckSession method

request.getRequestDispatcher("Admin.jsp").forward(request, response);

应该是

response.sendRedirect("Admin.jsp");
return false;

// in the doGet method
if (!Utils.CheckSession(request,response)) {
    return;
}

重定向不会立即发生, servlet 将继续执行,当它到达下一个 RequestDispatcher.forward 时,将引发异常

Redirects do not happen immediately, the servlet will continue execution and when it hits the next RequestDispatcher.forward call the exception is raised.

服务器需要在http响应中发送http:redirect状态代码,然后浏览器接收响应并请求重定向URL指定的资源。

The server needs to send the http: redirect status code in the http response, the browser then receives the response and requests resource specified by the redirect url.

这篇关于Servlet with java.lang.IllegalStateException:在提交响应后无法转发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆