Java servlet: response.sendRedirect () no da una excepción de estado ilegal si se llama después de confirmar la respuesta. ¿Por qué?
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);
}
}
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.