nodejs中的cookie和session

nodejs中的cookie和session

因为http是一种不保存状态的协议,即无状态协议。HTTP协议自身不对请求和相应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求和相应都不做持久化处理。这就表示每次刷新都需要重新登录,十分麻烦。所以服务端为了处理这个麻烦出现了cookie和session.

cookie和session的区别

  • cookie数据存放在客户的浏览器上,session数据存放在服务器上。
  • cookie不是很安全,用户可以修改并且进行cookie欺骗。session相对安全。
  • session会在一定时间内保存在服务器上。当访问增多,会占用服务器的性能。
  • 单个cookie保存的数据不能超过4096子节,而且很多浏览器都限制cookie的数量。

最后建议将重要的登录信息等存发为session,其他需要保留的信息可以存放在cookie中。

在node中使用cookie

  1. 在express中读取cookie(cookie-parser)
//引入cookie-parser 框架,读取客户端发送的cookie

const express = require('express');
const cookieParase = require('cookie-parser');

let app = express();
//这点很重要,如果没有,下面的req.cookies 会返回undefined
app.use(cookieParase());

app.use('/', function (req,res) {
    res.cookie('name', '111111');
    console.log(req.cookies);
    res.send('ok')
})

app.listen(8080)
  1. 发送cookie,直接使用res.cookies();即可

cookie的一些常用属性:

  • name=value:键值对,可以设置要保存的 Key/Value,注意这里的 name 不能和其他属性项的名字一样
  • Expires: 过期时间(秒),在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT
  • maxAge: 最大失效时间(毫秒),设置在多少后失效
  • secure: 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效
  • Path: 表示 cookie 影响到的路,如 path=/。如果路径不能匹配时,浏览器则不发送这个Cookie
  • httpOnly:是微软对COOKIE做的扩展。如果在COOKIE中设置了“httpOnly”属性,则通过程序(JS脚本、applet等)将无法读取到COOKIE信息,防止XSS攻击产生
const express = require('express');
let app = express();
app.use('/aaa/a.html',function(req,res){//只能对aaa目录下的a.html起作用
    res.cookie('name','11111',{
    path:'/aaa',
    maxAge:1*24*3600*1000
    });
    res.send('ok');
});
server.listen(8080);
  1. 删除cookie
res.clearCookie('name');
  1. cookie签名

我们可以通过cookie签名来简单的防止cookie中的数据在客户端进行修改。

const express = require('express');
const cookieParser = require('cookie-parser');

//随机生成的秘密字符串
const signStr = 'okokkokokokokokokok'

let app = express();

//需要将密匙传给cookieParser, 在接收数据的时候,进行解析。
app.use(cookieParser(signStr));

app.use('/', function (req, res) {
    //将密匙字符串赋值给req.secret,可以省略,在上面cookieparser()时会自动对secret赋值
    req.secret=signStr;

    //返回给浏览器的cookie, 这就是传说中的种cookie了
    //如果需要开启签名,第三个参数对象signed 设置为true.
    //由于cookie的大小限制4k,而签名后的cookie体积会增加,所以重要的cookie才签名
    res.cookie('cookiename', 'akueq', {signed: true, maxAge: 3600})

    //有没有签名的cookie,获取方式不一样。
    console.log('无签名', req.cookies);
    console.log('带签名',req.signedCookies);
    res.send('ok')
})
app.listen(8080);

这样如果客户端对cookie进行修改,就不会通过服务端的验证,一定程度上可以保证安全。但是非常隐私的数据还是建议session来存储。(因为这样还是没有对数据进行加密)

session

session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而session保存在服务器上。

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

使用session需要单独安装 express-session 模块

session(options)有可一些选的参数:

  • name: 设置 cookie 中,保存 session 的字段名称,默认为 connect.sid 。
  • store: session 的存储方式,默认存放在内存中,也可以使用 redis,mongodb 等。express 生态中都有相应模块的支持。
  • secret: 通过设置的 secret 字符串,来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改。
  • cookie: 设置存放 session id 的 cookie 的相关选项,默认为 (default: { path: ‘/’, httpOnly: true, secure: false, maxAge: null })
  • genid: 产生一个新的 session_id 时,所使用的函数, 默认使用 uid2 这个 npm 包。
  • rolling: 每个请求都重新设置一个 cookie,默认为 false。
  • resave: 即使 session 没有被修改,也保存 session 值,默认为 true。
//配置session
const express = require('express');
const session = require('session');
let app = express();
 
app.use(session({
    secret: 'this is the secret for cookie',
    resave: false,
    saveUninitialized: true
    cookie: {maxAge: 60 * 1000 * 30} // 过期时间(毫秒)
}));

app.get('/', function (req, res) {
    if (req.session.sign) {//检查用户是否已经登录
        console.log(req.session);//打印session的值
        res.send('ok');
    } else {//否则展示index页面
        req.session.sign = true;
        req.session.name = 'wodewangzhan';
        res.end('welcome');
    }
});
app.listen(8080);

//获取session数据
let user = req.session.user;
console.dir(user);//打印该对象的所有属性和属性值

//清除session
req.session.destroy(function(err) {
    res.redirect('/');
})
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要编写一个Node.js爬虫并进行登录,需要遵循以下步骤: 1. 安装Node.js和相关依赖库:可以使用npm来安装request、cheerio、superagent等库,这些库可以帮助你发送HTTP请求和解析HTML。 2. 了解登录机制:在进行登录之前,需要了解你要爬取的网站的登录机制,通常网站会使用cookiesession来管理用户登录状态。你需要在请求头添加cookiesession信息来模拟用户登录状态。 3. 发送登录请求:使用superagent库来发送POST请求,携带用户名和密码等登录信息,获取cookiesession信息。 4. 保存cookiesession信息:将获取到的cookiesession信息保存下来,在后续的爬虫请求使用。 5. 发送爬虫请求:使用request库来发送HTTP请求,通过添加cookiesession信息来模拟用户登录状态,获取需要的数据。 以下是一个简单的Node.js爬虫登录示例代码: ```javascript const request = require('request'); const cheerio = require('cheerio'); const superagent = require('superagent'); // 登录信息 const loginInfo = { username: 'your_username', password: 'your_password' }; // 登录请求地址 const loginUrl = 'http://example.com/login'; // 发送登录请求 superagent.post(loginUrl) .send(loginInfo) .end((err, res) => { // 获取cookiesession信息 const cookie = res.header['set-cookie']; const session = res.body.session; // 保存cookiesession信息 const options = { url: 'http://example.com', headers: { 'Cookie': cookie, 'Session': session } }; // 发送爬虫请求 request(options, (error, response, body) => { const $ = cheerio.load(body); // 解析HTML获取需要的数据 const data = $('h1').text(); console.log(data); }); }); ``` 注意:以上示例代码仅供参考,具体实现方式需要根据网站的登录机制和数据获取方式进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值