2009-12-21 5 views
14

Voglio intercettare una richiesta utilizzando il RequestDispatcher, e poi voglio inoltrare la richiesta insieme ad un altro servlet - qualcosa di simile:Un RequestDispatcher inoltra il metodo HTTP della richiesta originale?

RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/some.ThirdPartyServlet" + "?" + "param_name=" + "somevalue"); 
dispatcher.forward(request, response); 

Se la richiesta in ingresso fosse un POST, sarà la richiesta di prendere dispatcher i miei nuovi parametri e li includo nel corpo del messaggio o questo forward ora diventa GET?

risposta

15

Conserva la richiesta originale, senza modificarla.

Quindi, rimarrà POST se fosse POST.

7

Se si utilizza in avanti, il controllo rimane all'interno del contenitore servlet, gli attributi della richiesta vengono mantenuti e la richiesta rimane POST. È quando si usa il reindirizzamento che provoca l'invio di una risposta al browser, provocando una richiesta GET, che è quella in cui perde gli attributi della richiesta per la richiesta originale perché GET è una richiesta completamente nuova.

14

Penso che la vostra preoccupazione sia piuttosto la disponibilità della richiesta passata parametri (non attributi come menziona altri). In questo caso non importa se usi un forward o un reindirizzamento. Tuttavia, se si utilizza un inoltro a un altro Servlet, verrà richiamato il metodo appropriato associato alla richiesta iniziale come ottenuto da HttpServletRequest#getMethod(). Se è POST, verrà richiamato doPost(). È comunque possibile accedere ai parametri aggiuntivi nella stringa di query nel modo usuale tramite HttpServletRequest.getParameter().

Quindi, fondamentalmente quanto segue in servlet1:

protected void doPost(HttpServletRequest request, HttpServletResponse response) { 
    request.getRequestDispatcher("servlet2?foo=bar").forward(request, response); 
} 

può sostanzialmente essere gestito da servlet2 come segue:

protected void doPost(HttpServletRequest request, HttpServletResponse response) { 
    String foo = request.getParameter("foo"); // Returns "bar". 
}