2009-01-12 10 views
12

Actualmente estoy ejecutando una aplicación con las siguientes propiedades:da soporte a sesiones sin cookies en Tomcat

  • basado en Java con Spring y Acegi
  • se ejecutan en Tomcat 5

Necesito la capacidad para admitir sesiones de usuario sin cookies. ¿Podría alguien señalarme en la dirección correcta?

Gracias.

+1

en caso de que no este trabajo fuera de la caja en Tomcat? el contenedor de servlets debe establecer un parámetro de petición JSESSIONID en el primer uso de la sesión, una d si el cliente no envía una respuesta que indique que acepta cookies, se supone que el contenedor debe seguir usando este parámetro ... creo. –

Respuesta

18

La respuesta completa a esta pregunta es una combinación de todas sus respuestas, así que voy a resumir:

  1. No hay necesidad de establecer cookies = "false" en el archivo context.xml . La funcionalidad ideal es que tomcat use su identificación de sesión basada en url, que se usará de manera predeterminada si el usuario no admite las cookies.

  2. Cuando un usuario no tiene habilitadas las cookies, tomcat identificará la sesión mediante el parámetro "JSESSIONID" de la url de la solicitud. Un URL de ejemplo pareja son los siguientes http://www.myurl.com;jsessionid=123456AFGT3 http://www.myurl.com;jsessionid=123456AFGT3?param1=value&param2=value2 Note como el identificador de sesión no es parte de la cadena de consulta URL (esto es un estándar J2EE)

  3. Con el fin de garantizar el parámetro jsessionid consigue adjunta a toda su petición URL, no puede tener referencias de URL simples. Por ejemplo, en JSTL, debe usar < c: url>. El servlet engine agregará automáticamente el jsessionid a la url si es necesario. He aquí un ejemplo:

    <% - esto es malo: -%> < a href = "pagina.html"> Enlace </a>

    <% - esto es bueno: - %> < a href = "< c: valor de url = 'página.html '/> "> Enlace </a>

+0

¿Cuál es la manera de hacerlo si estoy usando las llamadas ajax? (no enlaces href) – maximus

0

Puede rastrear por dirección IP, pero los servidores proxy (¿y NAT?) Podrían arruinarlo.

Puede forzar todas las URL para tener la sesión como parámetro y todas las formas como un campo oculto. Tal vez una etiqueta personalizada para generar URL podría ayudar aquí, pero no he trabajado mucho con taglibs.

Deberá tener en cuenta la seguridad: las personas pueden enviar enlaces a otra persona con la ID de la sesión, por lo que querrá tener una dirección IP para cada acceso y verificar que la dirección coincida con la sesión.

+0

Yo recomendaría nunca hacer un seguimiento por dirección IP debido a las VPN. Esta respuesta es antigua, por lo que no rechazaré, pero desaconsejo encarecidamente esto para los futuros espectadores. – azdragon2

4

Ver http://tomcat.apache.org/tomcat-5.5-doc/config/context.html.

En un archivo META-INF/context.xml,

<?xml version='1.0' encoding='UTF-8'?> 
<Context path='/myApplicationContext' cookies='false'> 
    <!-- other settings --> 
</Context> 
+1

Esto parece adjuntar JSESSIONID a la url en la primera solicitud a la aplicación. Pero, ¿cómo me aseguro de que se adjunte a las solicitudes posteriores? –

0

como Matt b comentado esto debería funcionar fuera de la caja (gato intentará galletas, y si eso no funciona recurrir a la codificación de la sesión en la url). Sin embargo, esto no funcionará si usted mismo crea un enlace 'simple' - siempre use un método como JSTL para que tomcat pueda agregar el parámetro de seguimiento a todas las direcciones URL.

0

mejor manera es utilizar reescritura de URL. Por lo tanto, cuando se utiliza request.getSession(), la container enviará" Set-Cookie "cabecera para session-id en HTTP-respuesta así como session-id adjunta al URL (pero debe utilizar response.encodeURL(session_info) para la reescritura de URL).

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException { 
    resp.setContentType("text/html"); 
    PrintWriter pw=resp.getWriter(); 
    HttpSession session=req.getSession(); 
    pw.println("<html><body>"); 
    pw.println("<a href=\""+resp.encodeURL("/session_info")+"\">Click</a>"); 
    pw.println("</body></html>"); 

} 
Cuestiones relacionadas