HttpServletRequest: ¿cómo obtener la URL de referencia?

144

Necesito registrar las URL que están vinculadas a mi sitio en un Servlet Java.

shane
fuente
¿Le entendí correctamente que si encontré su sitio en Google y abrí el enlace, entonces ingresó 'google.com'?
Romano

Respuestas:

310

Está disponible en el encabezado HTTPreferer . Puede obtenerlo en un servlet de la siguiente manera:

String referrer = request.getHeader("referer"); // Yes, with the legendary misspelling.

Sin embargo, debe darse cuenta de que se trata de un valor controlado por el cliente y, por lo tanto, puede suplantarse a algo completamente diferente o incluso eliminarse. Por lo tanto, sea cual sea el valor que devuelva, no debe usarlo para ningún proceso comercial crítico en el back-end, sino solo para el control de la presentación (por ejemplo, ocultar / mostrar / cambiar ciertas partes de diseño puro) y / o estadísticas.

Para los interesados, los antecedentes sobre la falta de ortografía se pueden encontrar en Wikipedia .

BalusC
fuente
2
¿Hay alguna diferencia entre "árbitro" y "árbitro"?
ante.sabo
77
@ante: no, la búsqueda del encabezado no distingue entre mayúsculas y minúsculas.
BalusC
2
Tenga en cuenta que cualquier encabezado puede ser null.
rds
@BalusC ¿Qué sucede si necesito las dos URL anteriores? Es posible ?
Angel Cuenca
26

En realidad es: request.getHeader("Referer")o incluso mejor, y para estar 100% seguro request.getHeader(HttpHeaders.REFERER), dónde está HttpHeaderscom.google.common.net.HttpHeaders

wpodgorski
fuente
11
De los documentos de Java EE API para el método getHeader(String name)(presupuesto):"The header name is case insensitive."
informatik01
77
votar de todos modos para la referencia de HttpHeaders. Apache HTTP es otra buena:org.apache.http.HttpHeaders
Barett
16

Las URL se pasan en la solicitud: request.getRequestURL() .

Si te refieres a otros sitios que están vinculados a usted? Desea capturar el Referidor HTTP, lo que puede hacer llamando a:

request.getHeader("referer");
Chris K
fuente
6

Como todos han mencionado, es

request.getHeader("referer");

Me gustaría añadir algunos detalles más sobre aspecto de seguridad de árbitro cabecera en contraste con la respuesta aceptada. En Abrir Proyecto Seguridad de Aplicaciones Web ( OWASP ), hojas de trucos bajo solicitud entre sitios Falsificación Hoja (CSRF) Prevención de trucos que menciona acerca de la importancia árbitro cabecera.

Más importante aún para esta verificación recomendada del mismo origen, JavaScript no puede establecer una cantidad de encabezados de solicitud HTTP porque están en la lista de encabezados 'prohibidos'. Solo los navegadores mismos pueden establecer valores para estos encabezados, haciéndolos más confiables porque ni siquiera una vulnerabilidad XSS puede usarse para modificarlos.

La verificación de Origen de origen recomendada aquí se basa en tres de estos encabezados protegidos: Origen, Referer y Host, por lo que es una defensa CSRF bastante fuerte por sí sola.

Puede consultar la lista de encabezados prohibidos aquí . El agente de usuario (es decir, el navegador) tiene el control total sobre estos encabezados, no el usuario.

Don D
fuente