Http - Cookie篇

2020-12-07  本文已影响0人  鱼猫大脚

HTTP是无状态协议,它本身不能以状态来区分和管理请求和响应。当服务端需要记录用户的状态时,就需要某种机制来记录和识别。

会话(Session) 跟踪就是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是CookieSession,本篇介绍Cookie

Cookie

Cookie技术是客户端的解决方案。

Cookie通常以文本的方式记录服务端发来的特殊信息,并在之后的请求中带上Cookie以便让服务端确认,大致流程如下:

┌─────────────┐  1. Request              ┌───────────────┐
│             │ ───────────────────────> │               │
│             │  2. Response Set-Cookie  │               │
│             │ <─────────────────────── │               │
│  Web Client │                          │  Web Server   │
│             │  3. Request + Cookie     │               │
│             │ ───────────────────────> │               │
│             │  4. Response             │               │
│             │ <─────────────────────── │               │
└─────────────┘                          └───────────────┘

Set-Cookie

当服务端准备开始管理客户端状态时,会通过Set-Cookie来通知客户端建立Cookie,并要求在后续的请求中将此Cookie发送回服务端,直到Cookie过期。

Set-Cookie有几个主要的属性:

属性 说明
Name=Value Cookie信息键值对 - 必需项
Expires=<date> Cookie过期时间戳
Max-Age=<number> Cookie有效时间(秒)
Domain=<domain-value> Cookie限制发送范围的文件目录
Path=<path-value> Cookie适用对象的域名
Secure Cookie是否只适用与Https
HttpOnly Cookie无法使用JavaScript获得,防止跨站脚本攻击(XSS)

服务端操作Cookie(Java)

添加Cookie

Cookie cookie = new Cookie("username","lili");  // 新建Cookie
cookie.setDomain(".example.com");               // 设置域名
cookie.setPath("/");                            // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE);            // 设置有效期
response.addCookie(cookie);                     // 输出到客户端

获取Cookie

Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
    // cookie.getName();
    // cookie.getValue();
}

客户端操作Cookie(JavaScript)

获得Cookie的值

function getCookie(cname) {
  var name = cname + "=";
  var decodedCookie = decodeURIComponent(document.cookie);
  var ca = decodedCookie.split(';');
  for(var i = 0; i <ca.length; i++) {
      var c = ca[i];
      while (c.charAt(0) == ' ') {
          c = c.substring(1);
      }
      if (c.indexOf(name) == 0) {
          return c.substring(name.length, c.length);
      }
  }
  return "";
}

设置Cookie值

function setCookie(cname, cvalue, exdays) {
  var d = new Date();
  d.setTime(d.getTime() + (exdays*24*60*60*1000));
  var expires = "expires="+ d.toUTCString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}

删除Cookie

function delCookie(name) {
  var cval=getCookie(name);
  if(cval!=null) {
    setCookie(name, cval, -1);
  }
}

参考

本文完

上一篇下一篇

猜你喜欢

热点阅读