Reindirizzamento servlet vs Forward

1. Panoramica

Occasionalmente, il gestore della richiesta HTTP iniziale nel nostro servlet Java deve delegare la richiesta a un'altra risorsa. In questi casi, possiamo inoltrare ulteriormente la richiesta o reindirizzarla a una risorsa diversa.

Useremo entrambi i meccanismi e discuteremo le differenze e le migliori pratiche di ciascuno.

2. Dipendenze di Maven

Innanzitutto, aggiungiamo la dipendenza Servlet Maven:

 javax.servlet javax.servlet-api 4.0.0 

L'ultima versione può essere trovata qui.

3. Avanti

Facciamo ora un salto e diamo un'occhiata a come eseguire un semplice forward:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) { RequestDispatcher dispatcher = getServletContext() .getRequestDispatcher("/forwarded"); dispatcher.forward(req, resp); }

Otteniamo il riferimento RequestDispatcher dal Servlet padre e lo indirizziamo a un'altra risorsa del server.

In poche parole, questo inoltrerà la richiesta.

Quando un client invia una richiesta a // localhost: 8081 / hello? Name = Dennis , questa logica verrà eseguita e la richiesta verrà inoltrata a " / forwarded ".

4. Reindirizzamento

Ora che abbiamo compreso il concetto di inoltro, diamo un'occhiata a un breve snippet per il reindirizzamento:

protected void doGet(HttpServletRequest req, HttpServletResponse resp){ resp.sendRedirect(req.getContextPath() + "/redirected"); } 

Usiamo l'oggetto risposta originale per reindirizzare questa richiesta a un altro URL : " / redirected".

Quando un client invia una richiesta a // localhost: 8081 / welcome? Name = Dennis , la richiesta verrà reindirizzata a // localhost: 8081 / redirected.

Per saperne di più sull'esecuzione di reindirizzamenti nel contesto della primavera, dai un'occhiata al nostro articolo dedicato qui.

5. Differenze

Abbiamo passato il parametro " nome " con un valore in entrambi i casi. In poche parole, le richieste inoltrate portano ancora questo valore, ma le richieste reindirizzate no.

Questo perché, con un reindirizzamento, l'oggetto richiesta è diverso da quello originale. Se vogliamo ancora utilizzare questo parametro, dobbiamo salvarlo nell'oggetto HttpSession .

Ecco un elenco delle principali differenze tra servlet forward e redirect:

Avanti :

  • La richiesta verrà ulteriormente elaborata sul lato server
  • Il client non viene influenzato dall'inoltro, l'URL in un browser rimane lo stesso
  • Gli oggetti richiesta e risposta rimarranno lo stesso oggetto dopo l'inoltro. Gli oggetti dell'ambito della richiesta saranno ancora disponibili

Reindirizzamento :

  • La richiesta viene reindirizzata a una risorsa diversa
  • Il client vedrà la modifica dell'URL dopo il reindirizzamento
  • Viene creata una nuova richiesta
  • Il reindirizzamento viene normalmente utilizzato all'interno del modello di sviluppo web Post / Reindirizza / Ottieni

6. Conclusione

L'inoltro e il reindirizzamento riguardano entrambi l'invio di un utente a risorse diverse, sebbene abbiano una semantica abbastanza diversa.

Scegliere tra questi è semplice. Se è richiesto l'ambito precedente o l'utente non ha bisogno di essere informato, ma l'applicazione desidera anche eseguire un'azione interna, utilizzare l'inoltro .

Per eliminare l'ambito o se il nuovo contenuto non è associato alla richiesta originale, ad esempio un reindirizzamento a una pagina di accesso o il completamento dell'invio di un modulo, utilizzare il reindirizzamento .

Come sempre, il codice di esempio può essere trovato su GitHub.