javascript - example - set cookie angular 4
Set-Cookie en el encabezado HTTP se ignora con AngularJS (6)
Estoy trabajando en una aplicación basada en AngularJS en el lado del cliente y Java para mi API (Tomcat + Jersey para WS) en el lado del servidor.
Algunas rutas de mi API están restringidas; si el usuario no tiene una sesión, el estado de respuesta devuelto es 401. En el lado del cliente, se interceptan 401 estados HTTP para redirigir al usuario a la página de inicio de sesión.
Una vez que el usuario está autenticado, creo una sesión en el lado del servidor
httpRequest.getSession(true); y la respuesta enviada al cliente tiene la instrucción Set-cookie en su encabezado:
Set-Cookie:JSESSIONID=XXXXXXXXXXXXXXXXXXXXX; Domain=localhost; Path=/api/; HttpOnly
El problema es que la cookie nunca se pone en el lado del cliente. Cuando inspecciono cookies para el dominio localhost está vacío, por lo que las siguientes solicitudes no tienen esta cookie en su encabezado y el lado del cliente aún no puede acceder a la ruta restringida de mi API.
El cliente y el servidor están en el mismo dominio pero no tienen la misma ruta y el mismo número de puerto:
Cliente: http://localhost:8000/app/index.html
Servidor: http://localhost:8080/api/restricted/
Información adicional: CORS está habilitado en ambos lados:
"Access-Control-Allow-Methods", "GET, POST, OPTIONS" "Access-Control-Allow-Origin", "*" "Access-Control-Allow-Credentials", true
¿Alguna idea para hacer que Set-cookie funcione correctamente? ¿Es un problema relacionado con AngularJS?
Acabo de resolver un problema como este.
Estaba haciendo esto y no estaba trabajando ...
$cookies.put(''JSESSIONID'', response.data);
Las cookies se guardan en el navegador, pero cuando envié una nueva solicitud, todas las cookies se enviaron excepto la mía. (mi cookie es JSESSIONID)
Luego miro en el inspector de cromo y encontré esto:
¡¡EL PROBLEMA ES QUE NO FUE EL CAMINO CORRECTO !!!
entonces probé esto y mis cookies fueron enviadas. ¡Hurra! :
$cookies.put(''JSESSIONID'', response.data, {''path'':''/''});
No sé si este es tu caso, pero esto funcionó para mí.
¡Saludos!
En su solicitud posterior en el lado del cliente, asegúrese de agregar lo siguiente:
Para solicitudes de jquery ajax:
$.ajax({
url: "http://yoururlgoeshere",
type: "post",
data: "somedata",
xhrFields: {
withCredentials: true
}
});
Con el servicio $ http de Angular:
$http.post("http://yoururlgoeshere", "somedata", {
withCredentials: true
});
Encontré un problema en AngularJS que me ayudó a seguir adelante.
Parece que "Access-Control-Allow-Credentials" : true
no se estableció en el lado del cliente. La instrucción $httpProvider.defaults.withCredentials = true
fue ignorada.
Sustituyo $ resource call por una simple llamada $ http con {withCredentials: true} en el parámetro config.
He logrado resolver un problema muy similar al tuyo. ¡Mi juego! backend intentó establecer una sesión Cookie que no pude capturar en Angular ni almacenar a través del navegador.
En realidad, la solución involucró un poco de esto y un poco de eso.
Suponiendo que haya resuelto el problema inicial, que solo puede resolverse agregando un dominio específico a Access-Control-Allow-Origin y eliminando el comodín, los siguientes pasos son:
Debe eliminar el HTTP-Only del encabezado
Set-Cookie
, de lo contrario, nunca podrá recibir una cookie "generada" por su código angular
Esta configuración ya funcionará en Firefox, aunque no en ChromePara que funcione también para Chrome, debes:
a) envíe un dominio diferente de localhost en la cookie, usando el dominio que su WS está "alojado". Incluso puede usar comodines como
.domain.com
lugar dews.domain.com
b) luego deberá hacer una llamada al dominio que especificó en la cookie, de lo contrario, Chrome no almacenará su cookie
[opcional] Quitaría esa ruta
/api
a favor de a/
Y eso debería ser el truco.
Espero haber sido de alguna ayuda
La adición de HttpOnly significa que el navegador no debe permitir que los complementos y JavaScript vean la cookie. Esta es una convención reciente para una navegación más segura. Debería usarse para J_SESSIONID pero quizás no aquí.
Necesita trabajar tanto en el servidor como en el lado del cliente.
Cliente
Establezca $http
config withCredentials
en true
de una de las siguientes maneras:
Por solicitud
var config = {withCredentials: true}; $http.post(url, config);
Para todas las solicitudes
angular.module("your_module_name").config([''$httpProvider'', function($httpProvider) { $httpProvider.interceptors.push([''$q'', function($q) { return { request: function(config) { config.withCredentials = true; return config; } }; } ]); } ]);
Servidor
Establezca el encabezado de respuesta Access-Control-Allow-Credentials
en true
.