2010-04-11 10 views

risposta

6

Basta ottenere i cookie dal parametro Set-Cookie nelle intestazioni di risposta e inviarli indietro con richieste future. Non dovrebbe essere difficile

+12

Se non è difficile, potresti fornire uno snippet di esempio nella risposta? –

27

Risposta breve: no. E non è così bello.

L'ho implementato come parte di npm in modo da poter scaricare tarball da github. Ecco il codice che lo fa: https://github.com/isaacs/npm/blob/master/lib/utils/fetch.js#L96-100

var cookie = get(response.headers, "Set-Cookie") 
if (cookie) { 
    cookie = (cookie + "").split(";").shift() 
    set(opts.headers, "Cookie", cookie) 
} 

Il file ha un sacco di cose specifiche-NPM (log, set, ecc), ma dovrebbe mostrare l'idea generale. Fondamentalmente, sto raccogliendo i cookie in modo che io possa rispedirli alla prossima richiesta quando vengo reindirizzato.

Ho parlato con Mikeal Rogers sull'aggiunta di questo tipo di funzionalità al suo util "request", completo con il supporto di un cookiejar con supporto del file system, ma è davvero piuttosto complicato. Devi tenere traccia di quali domini inviare i cookie e così via.

Questo probabilmente non sarà mai incluso nel nodo direttamente, per questo motivo. Ma attenzione agli sviluppi nello userspace.

MODIFICA: ora è supportato di default in Richiesta.

4

Se stai cercando di fare i cookie lato client è possibile utilizzare https://github.com/mikeal/request

M.

+1

L'ho provato con "jar: true" come descritto nel loro documento, ma non funziona ... –

2

Il codice di seguito viene illustrato l'utilizzo dei cookie da parte del server, ecco una demo server API che analizza i cookie da un client HTTP e controllare l'hash dei cookie:

var express = require("express"), 
app  = express(), 
hbs = require('hbs'), 
mongoose = require('mongoose'), 
port = parseInt(process.env.PORT, 10) || 4568; 

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.static(__dirname + '/public_api')); 
app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 
app.get('/api', function (req, res) { 
    var cookies = {}; 
    req.headers.cookie && req.headers.cookie.split(';').forEach(function(cookie) { 
     var parts = cookie.split('='); 
     cookies[ parts[ 0 ].trim() ] = (parts[ 1 ] || '').trim(); 
    }); 
    if (!cookies['testcookie']) { 
     console.log('First request'); 
     res.cookie('testcookie','testvaluecookie',{ maxAge: 900000, httpOnly: true }); 
     res.end('FirstRequest'); 
    } else { 
     console.log(cookies['testcookie']); 
     res.end(cookies['testcookie']); 
    } 
}); 

app.listen(port); 

Sul lato client, basta fare una richiesta normale al server API di cui sopra, sto usando il modulo di richiesta, è da trasferimenti di default dei cookie per ogni richiesta.

request(options, function(err, response, body) {  
    console.log(util.inspect(response.headers)); 
    res.render("index.html", {layout: false,user: { 
     username: req.session.user + body 
    }}); 
}); 
2

Una soluzione feature-complete per i biscotti

le soluzioni self-made proposti nelle altre risposte qui non coprire un sacco di casi particolari, possono facilmente rompere e la mancanza di un sacco di funzioni standard, come ad come persistenza

Come mentioned by isaacs, il modulo request ora ha un vero supporto per i cookie. They provide examples with cookies on their Github page. Gli esempi spiegano come abilitare il supporto dei cookie aggiungendo un "tough-cookie" cookie jar alla richiesta.

NOTA: un contenitore di biscotti contiene e consente di gestire i cookie.

per citare i loro Readme (a partire da aprile 2015):

I cookie sono disabilitati di default (altrimenti, sarebbero stati utilizzati in richieste successive). Per abilitare i cookie, impostare jar a true (nei valori di default o opzioni ) e installare tough-cookie.

La gestione dei cookie viene fornita tramite lo tough-cookie module. È uno strumento di gestione dei cookie stabile, piuttosto completo di funzionalità che implementa lo "HTTP State Management Mechanism" - RFC 6265. Offre anche una varietà di opzioni per conservare (memorizzare) i cookie, utilizzando un cookie store.