2014-09-04 3 views
1

У меня есть следующий фрагмент кода в моем веб-приложение:заподлицо() в rd.include против rd.forward()

if (request.getParameter("user").equals("luke")||session == null && !(uri.endsWith("html") || uri.endsWith("LoginServlet"))) { 
    System.out.println("<<<----------denied------------->>>>"); 
    pw.println("zzzzzzzzzz"); 
    this.context.log("Unauthorized access request"); 
    pw.flush(); 

    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //res.sendRedirect("login.html"); 
    req.getRequestDispatcher("login.html").include(request,response); 
} 

Когда я использую Промывка перед Forward(), это бросание IllegalStateException (так как ответ отправляется в тот момент, когда мы вызываем flush, и позже мы пытаемся повторно отправить ответ, используя forward), но код работает нормально даже после того, как я предоставил флеш до rd.include(). Почему здесь не исключение?

ТИА

ответ

0

forward и include различные методы, включаемый метод позволяет добавлять содержимое в ответ, у вас есть в JSP с include tag, включаемым методом аналогичным, но на сервере.

Метод forward переносит обработку запроса на другой процесс (сервлет, jsp), и этот процесс должен изменить ответ, поэтому вы получаете это исключение, вы не можете изменить ответ перед пересылкой.

Вы можете проверить документацию по этим методам here.

1

Эта проблема объясняется в Servlet Specification для метода forward в главе 9.4 и для метода include в главе 9.3.

Javadoc также объясняет это в деталях.

Запись Javadoc из HttpServletResponse#getWriter() заявляет

Вызов flush() на PrintWriter совершает ответ.

Выполнение ответного сообщения, записывающего строку состояния и заголовки и промывку любой части тела ответа в буфере.

В javadoc of forward состояния

перенаправляет запрос из сервлета на другой ресурс (сервлетов, JSP файл или HTML-файл) на сервере. Этот метод позволяет одному сервлету выполнить предварительную обработку запроса и другой ресурс до сформировать ответ.

Таким образом, передовой ресурс должен заботиться о создании и передаче ответа. Он не может этого сделать, если ответ уже сделан.

В javadoc of include состоянии

Прилагаемый сервлет не может изменить код состояния ответа или установить заголовки; любая попытка внести изменения игнорируется.

Этот метод просто берет содержание другого ресурса и записывает его в ответ. Он не может ничего сделать для заголовков или кода состояния. Таким образом, совершение до или после не имеет никакого значения.

+0

thats right, но flush фиксирует состояние выходного потока, а ответ отправляется клиенту, то почему в случае включения исключение не возникает, когда ответ отправляется снова rd.include(). –

+0

@jayendrabhatt Не отправлено _again_. Содержимое «include» добавляется (добавляется) в ответ ** body **. –

+0

Извинения за мое незнание, но к тому времени, когда мы пытаемся добавить информацию, используя include для ответа, ответ уже исчез (из-за флеша). Затем, как страница будет включена? Пожалуйста, исправьте меня, если я ошибаюсь –