Java servlet: response.sendRedirect () no da una excepción de estado ilegal si se llama después de confirmar la respuesta. ¿Por qué?

StackOverflow https://stackoverflow.com/questions/1023443

Pregunta

después de confirmar la respuesta, ya que aquí la instrucción de redireccionamiento debería dar una excepción, pero no lo hace si este estado de redirección está en if block. estrellas marcadas) en dos lugares a continuación. ¿Puede decirme por qué?

protected void doPost(HttpServletRequest request, HttpServletResponse response)          throws    ServletException, IOException {
            // TODO Auto-generated method stub
    synchronized (noOfRequests)
    {
        noOfRequests++;
        }
        PrintWriter pw=null;
        response.setContentType("text/html");
        response.setHeader("foo","bar");

// la respuesta se confirma debido a la declaración anterior

        pw=response.getWriter();
        pw.print("hello : "+noOfRequests);

// si elimino la siguiente declaración, esta misma declaración está presente en el bloque if.so, la declaración en el bloque if también debería dar una excepción como esta, pero no lo hace, ¿por qué?

***response.sendRedirect("http://localhost:8625/ServletPrc/login%  20page.html");


    if(true)
    {
                  //same statement as above
        ***response.sendRedirect("http://localhost:8625/ServletPrc/login%20page.html");
    }
    else{

        request.setAttribute("noOfReq", noOfRequests);
        request.setAttribute("name", new Name().getName());
        request.setAttribute("GmailId",this.getServletConfig().getInitParameter("GmailId") );
        request.setAttribute("YahooId",this.getServletConfig().getInitParameter("YahooId") );
        RequestDispatcher view1=request.getRequestDispatcher("HomePage.jsp");
        view1.forward(request, response);

    }


}               
¿Fue útil?

Solución

de la especificaciones de servlet , 5.3:

  

Estos métodos tendrán el efecto secundario de confirmar la respuesta, si tiene   aún no se ha comprometido, y terminarlo. No hay más salida para el cliente   debe ser realizado por el servlet después de invocar estos métodos. Si los datos se escriben en   la respuesta después de llamar a estos métodos, los datos se ignoran.

     

Si los datos se escribieron en el búfer de respuesta, pero no se devolvieron al cliente   (es decir, la respuesta no se confirma), los datos en el búfer de respuesta deben ser   borrado y reemplazado con el conjunto de datos por estos métodos. Si la respuesta es   comprometido, estos métodos deben lanzar una IllegalStateException.

Creo que estas dos especificaciones cubren todos sus casos.

Otros consejos

intente poner una respuesta.flush justo antes de que termine su primer bloque, escriba todo lo que desee, pero a menos que se envíe fuera del búfer, aún no se ha confirmado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top