Pagina di provenienza (Referer)

DOMANDA:

In una JSP (Java Server Page) posso risalire all'indirizzo della pagina di provenienza?



RISPOSTA:

Come in molti altri linguaggi, questa operazione è possibile anche con le Java Server Pages e ovviamente con le Servlet. L'url di provenienza prende il nome di Referer e, grazie ai metodi già forniti dalla classe HttpServletRequest, possiamo riuscire nel nostro intento con questa riga di codice:

String provenienza = request.getHeader("Referer");


Ecco un breve esempio di Servlet (Referer):

package referer;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Referer")
public class Referer extends HttpServlet {
   private static final long serialVersionUID = 1L;

   public Referer() {
     super();
   }

   protected void doGet(HttpServletRequest request, HttpServletResponse response)
                         throws ServletException, IOException {
      ServletOutputStream out = response.getOutputStream();
      String provenienza = request.getHeader("Referer");
      out.println(provenienza);
   }

   protected void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
      doGet(request, response);
   }
}


E uno di pagina JSP (showProvenienza.jsp):

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Il blog di Lancill</title>
</head>

<body>

<%= request.getHeader("Referer") %>

</body>
</html>


Con questa JSP (chiamata prima.jsp) è possibile richiamare sia la JSP showProvenienza.jsp che la Servlet Referer attraverso due link:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Il blog di Lancill</title>
</head>

<body>

<a href="showProvenienza.jsp">JSP</a><br /><br />

<a href="Referer">Servlet</a>

</body>
</html>

Cliccando sui due link vedremo a video la stringa http://localhost:8080/NomeProgetto/prima.jsp. Come si può intuire, il metodo restituisce una stringa contenente l'indirizzo completo della risorsa di provenienza. Da notare che il metodo restituisce logicamente null se richiamate showProvenienza.jsp o la Servlet Referer direttamente da url.

Tale metodo è utile sia per fini statistici, sia per discriminare l'accesso ed il comportamento della pagina in base alla provenienza.

Commenti

  1. Il Referer è davvero comodo e in alcuni casi è l'unico dato che consente di risolvere alcuni requisiti e/o problematiche.

    Purtroppo nelle richieste HTTP questo header potrebbe non essere sempre presente. Quindi attenzione nel basarsi su tale informazione senza avere un "paracadute".

    Riferimento: sezione 15.1.3 della RFC del protocollo HTTP (http://www.w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.3)

    RispondiElimina
    Risposte
    1. Ciao Francesco, parole sacrosante! Io aggiungerei che addirittura il referer potrebbe essere falsificato, con tutte le conseguenze che questo comporta! Grazie per il contributo

      Elimina

Posta un commento

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java