08月27, 2016

node学习笔记(4)

node学习笔记第四篇。不定期更新。

set-cookie is always an array. Duplicates are added to the array.

简单示例:

res.setHeader("Set-Cookie",["name=zfpx","age=6"])

显然我们在实际运用中是没有那么简单的,比较说有max-age,path,http-only等。

Set-Cookie: =[; =] 
[; expires=][; domain=] 
[; path=][; secure][; HttpOnly]

用原生node写代码,确实有些痛苦。那么我们来看一下express的实现吧。

查看express的源码,我们可以看到,它是这样实现的:

/**
 * Set cookie `name` to `value`, with the given `options`.
 *
 * Options:
 *
 *    - `maxAge`   max-age in milliseconds, converted to `expires`
 *    - `signed`   sign the cookie
 *    - `path`     defaults to "/"
 *
 * Examples:
 *
 *    // "Remember Me" for 15 minutes
 *    res.cookie("rememberme", "1", { expires: new Date(Date.now() + 900000), httpOnly: true });
 *
 *    // save as above
 *    res.cookie("rememberme", "1", { maxAge: 900000, httpOnly: true })
 *
 * @param {String} name
 * @param {String|Object} value
 * @param {Options} options
 * @return {ServerResponse} for chaining
 * @public
 */

res.cookie = function (name, value, options) {
  var opts = merge({}, options);
  var secret = this.req.secret;
  var signed = opts.signed;

  if (signed && !secret) {
    throw new Error("cookieParser("secret") required for signed cookies");
  }

  var val = typeof value === "object"
    ? "j:" + JSON.stringify(value)
    : String(value);

  if (signed) {
    val = "s:" + sign(val, secret);
  }

  if ("maxAge" in opts) {
    opts.expires = new Date(Date.now() + opts.maxAge);
    opts.maxAge /= 1000;
  }

  if (opts.path == null) {
    opts.path = "/";
  }

  this.append("Set-Cookie", cookie.serialize(name, String(val), opts));

  return this;
};

写cookie稍微复杂了点,但获取cookie还是相当容易的。

req.headers.cookie  //得到类似a=1; b=2;的字符串

querystring.parse(req.headers.cookie,"; ","="); //得到json对象

在express中,有一个中间件是cookieParse(),我们可以用它很方便地来处理cookie的相关操作。

它的用法有两种:不使用签名、使用签名(即cookieParse("自定义签名"))。

在服务器接受一个cookie的时候, 有个工作就是要鉴定这个cookie是不是合法的. 因为不怀好意者可以尝试伪造cookie. 所以cookie要有一个防伪. 这里用到的方法叫数字摘要。参考资料

我自身的理解是这样的,比如说用户名的相关信息,建议是用签名的,这样相对来说安全一些。

app.use(cookieParser("自定义签名"));
req.signedCookies.key //所有使用自定义签名的cookie,无法使用req.cookies.key来获取到,只能通过req.signedCookies
//在往cookie里面写入key时,必须要{signed:true}
res.cookie("key", "value", {signed:true});

sha1加密的处理:

var crypto = require("crypto");
function sha1(str){
    return crypto.createHash("sha1").update(str).digest("hex");
}

浅谈nodejs中的Crypto模块:加密、解密

express中cookie的使用和cookie-parser的解读

2.session

cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中了,而且如果 cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 session,session 中的数据是保留在服务器端的。

session 的运作通过一个 session_id 来进行。session_id 通常是存放在客户端的 cookie 中,比如在 express 中,默认是 connect.sid 这个字段,当请求到来时,服务端检查 cookie 中保存的 session_id 并通过这个 session_id 与服务器端的 session data 关联起来,进行数据的保存和修改。

session 可以存放在 1)内存、2)cookie本身、3)redis 或 memcached 等缓存中,或者4)数据库中。

cookie 和 session

未完待续

本文链接:www.my-fe.pub/post/node-study-part4.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。