2010-11-12 16 views
40

¿Puede decirme cómo almacenar jsessionid en una cookie, por lo que se puede pasar al servlet con una solicitud posterior? Estoy usando la versión 4.0.3 de Apache HttpClient. Todas las soluciones que he encontrado explican cómo hacerlo con HttpClient 3.1. He leído el tutorial y lo intenté, pero no funciona.Apache HttpClient 4.0.3 - ¿Cómo configuro la cookie con el ID de sesión para la solicitud POST

HttpPost httppost = new HttpPost(postData); 
CookieStore cookieStore = new BasicCookieStore(); 
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", getSessionId()); 
cookieStore.addCookie(cookie); 
client.setCookieStore(cookieStore); 
response = client.execute(httppost); 

Editar - más explicaciones
estoy conectando a los servlets escritos por el amigo. He iniciado sesión y obtuve jsessionid. Ahora quiero enviar otra solicitud y necesito pasar jsessionid para fines de autorización. Servlet funciona bien porque usé java HttpURLConnection, configuré la cookie, la pasé y funcionó. Ahora, con HttpClient, no recibo excepciones, pero el código de retorno del servlet de mi amigo indica que no hubo sessionid en la solicitud.

Otra edición - Tengo una solución Establecí el parámetro del encabezado de solicitud y funcionó. Servlet reconoció sessionid.
httppost.setHeader("Cookie", "JSESSIONID="+ getSessionId());

Ahora mi pregunta es: ¿Es este método correcto?

+0

Podría decirnos qué es exactamente lo que no funciona? ¿Recibe una excepción o se envía la solicitud sin la cookie? ¿Puedes proporcionar un volcado de protocolo de red? – ordnungswidrig

+0

Pruebe Fiddler http://www.fiddler2.com/fiddler2/ para ver exactamente qué sucede. –

+0

¡Muchas gracias! Logré que mi servidor reconociera la cookie a través de: httppost.setHeader ("Cookie", "JSESSIONID =" + getSessionId()); – Zennichimaro

Respuesta

22

lo hice pasar por la cookie a través de la HttpContext:

HttpContext localContext = new BasicHttpContext(); 

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

response = client.execute(httppost, localContext); 
+1

Deberías usar HttpClientContext en lugar de ClientContext que ahora está marcado como obsoleto. – Bludwarf

38

Estoy muy contenta de resolver este problema:

HttpPost httppost = new HttpPost(postData); 
CookieStore cookieStore = new BasicCookieStore(); 
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", getSessionId()); 

//cookie.setDomain("your domain"); 
cookie.setPath("/"); 

cookieStore.addCookie(cookie); 
client.setCookieStore(cookieStore); 
response = client.execute(httppost); 

tan fácil!

+12

La clave para mí fue establecer el dominio Y la ruta. No pasaría la cookie al servidor sin eso. – christophercotton

+1

Pasé muchas veces para resolver el problema con las cookies, el servidor no quería aceptar mi solicitud, sin embargo Firebug y las herramientas de desarrollo de Chrome muestran que todos los parámetros de cocción excepto el valor están vacíos. Solo cuando establecí los valores de dominio y ruta, la solicitud fue exitosa. Gracias. –

+1

Este enfoque ahora está en desuso ya que AbstractHttpClient, que expone el método setCookieStore, ahora está en desuso a partir de la versión 4.3. El enfoque de @ khai es ahora el preferido. –

1

Probablemente debería establecer todas las propiedades de las cookies no solo su valor. setPath(), etc ... setDomain()

+0

¡Bienvenido a este sitio! Esta es una Q de 2010, con dos respuestas que tienen un montón de votos ascendentes. No estoy seguro si consejos extra e imprecisos ayudarían a alguien. – joepd

8
HttpContext localContext = new BasicHttpContext(); 
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore); 
response = client.execute(httppost, localContext); 

no funciona en la versión 4.5 sin

cookie.setDomain(".domain.com"); 
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true"); 
+0

También encontré esta respuesta en otro tema, en realidad, debería establecer el dominio. – CoolMind

+0

Este 'cookie.setAttribute (ClientCookie.DOMAIN_ATTR," true ");' realmente funciona –

Cuestiones relacionadas