HTTP、Cookie、Session、token

HTTP、CookieSession

     HTTP协议作为无状态协议,无状态并不陌生,EJB bean中就有有状态、无状态之分,对于HTTP协议而言,无状态同样指每次request请求之前是相互独立的,当前请求并不会记录它的上一次请求信息。那么问题来了,既然无状态,那完成一套完整的业务逻辑,发送多次请求的情况数不胜数,使用http如何将上下文请求进行关联呢?机智的人类通过优化,找到了一种简单的方式记录http协议的请求信息

优化后的HTTP请求:

  1. 浏览器发送request请求到服务器,服务器除了返回请求的response之外,还给请求分配一个唯一标识ID,协同response一并返回给浏览器。

  2. 同时服务器在本地创建一个MAP结构,专门以key-value(请求ID-会话内容)形式将每个request进行存储

  3. 此时浏览器的request已经被赋予了一个ID,第二次访问时,服务器先从request中查找该ID,根据ID查找维护会话的content内容,该内容中记录了上一次request的信息状态。

  4. 根据查找出的request信息生成基于这些信息的response内容,再次返回给浏览器。如果有需要会再次更新会话内容,为下一次请求提供准备。

    所以根据这个会话ID,以建立多次请求-响应模式的关联数据传递。说到这里可能已经唤起了大家许多共鸣。这就是cookiesession对无状态的http协议的强大作用。服务端生成这个全局的唯一标识,传递给客户端用于唯一标记这次请求,也就是cookie;而服务器创建的那个map结构就是session所以cookies服务端生成,用于标记客户端的唯一标识,无特定含义,在每次网络请求中,都会被传送。session服务端自己维护的一个map数据结构,记录key-content上下文内容状态

Cookie7大属性

Name和valuecookie最常用的两个属性,也是用于标识当前cookieid和对应内容的属性。

Expires

用于设置cookie生命周期。

Path&domain

Path和domain是针对于不同路径、跨域请求中对cookie进行设置的属性。举个简单的例子,浏览器访问百度的cookie一定不会发送给新浪网;访问百度新闻时登录的信息同样可以用于百度网盘,虽然他们并非同一请求路径下生成的cookie。这就是cookie的域和路径的属性。浏览器发出请求时,会根据cookiedomainpath属性确定是否传送cookie信息。默认情况下,只会在同域同路径下的cookie才会被传输。

httpOnly&secure

httpOnly和secure属性是cookie用于设置协议的种类,如果设置了httpOnly则只有在http协议下对该cookie才可见。Secure是https时可见。这两个属性主要是为了对cookie信息进行保护。

使用java语言操作cookie

[java]   view plain  copy
  1. //get cookie信息    
  2.         Cookie[] cookies=req.getCookies();    
  3.         if(cookies!=null)    
  4.         {    
  5.             System.out.println(    
  6.                     cookies[0].getName()+","    
  7.                     +cookies[0].getMaxAge()+","    
  8.                     +cookies[0].getDomain()+","    
  9.                     +cookies[0].getPath()+","    
  10.                     +cookies[0].getValue()+","    
  11.                     +cookies[0].getSecure()+","    
  12.                     +cookies[0].isHttpOnly());      
  13.         }    
  14.         //写入cookie      
  15.         Cookie cookie=new Cookie("mycookieID", String.valueOf(System.currentTimeMillis()));    
  16.         cookie.setHttpOnly(true);    
  17.         cookie.setMaxAge(24*60*60);//24小时后过期 -以秒为单位的,基于当前时间的有效值    
  18.         cookie.setDomain("www.max.com"); //设置域名,表示该cookie仅对www.max.com是有效    
  19.         cookie.setPath("/");//设置路径为根路径,表示该cookie对根路劲下所有path有效    
  20.         //将cookie返回给浏览器    
  21.         resp.addCookie(cookie);    
  22.             
  23.         //删除cookie    
  24.         //cookie是没有真正的删除操作的,只能通郭cookie的有效时间,设置为负值即可。过去时间的cookie    
  25.         cookie.setMaxAge(-1);    

使用cookie需注意

  1. cookie数量过多过大,浪费网络流量,因为每次请求都会带着cookie,如果cookie过多或单个cookie携带信息较大,都会造成网络资源浪费;

  2. Cookie不适用于对敏感重要信息进行存储,因为浏览器中通过调试都可以看到该cookie具体信息,且每次都会在客户端缓存,所以针对一些重要密码等信息不应使用cookie进行存储

补充:

session

  session的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

 

cookie

  cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

     cookie的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径,一般设置为全局:"\")、失效时间、安全标志(指定后,cookie只有在使用SSL连接时才发送到服务器(https))。下面是一个简单的js使用cookie的例子:

用户登录时产生cookie:

document.cookie = "id="+result.data['id']+"; path=/";

document.cookie = "name="+result.data['name']+"; path=/";

document.cookie = "avatar="+result.data['avatar']+"; path=/";

使用到cookie时做如下解析:

var cookie = document.cookie;var cookieArr = cookie.split(";");var user_info = {};for(var i = 0; i < cookieArr.length; i++) {

    user_info[cookieArr[i].split("=")[0]] = cookieArr[i].split("=")[1];

}

$('#user_name').text(user_info[' name']);

$('#user_avatar').attr("src", user_info[' avatar']);

$('#user_id').val(user_info[' id']);

 

token

     token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库

 cookie session的区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
   考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
   考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE中

token 和session 的区别

    session 和 oauth token并不矛盾,作为身份认证 token安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态

    App通常用restful apiserver打交道。Reststateless的,也就是app不需要像browser那样用cookie来保存session,因此用session token来标示自己就够了,session/stateapi server的逻辑处理。 如果你的后端不是statelessrest api, 那么你可能需要在app里保存session.可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session.

 

   Session 是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓Session 认证只是简单的把User 信息存储到Session 里,因为SID 的不可预测性,暂且认为是安全的。这是一种认证手段。 Token ,如果指的是OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对App 。其目的是让 某App有权利访问 某用户 的信息。这里的 Token是唯一的。不可以转移到其它 App上,也不可以转到其它 用户 上。 转过来说Session Session只提供一种简单的认证,即有此 SID,即认为有此 User的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方App 所以简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了。

  token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;sessioncookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。

django cookie


# 登录动作
def login_action(request):
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
if username == 'admin' and password == 'admin123':
response = HttpResponseRedirect('/event_manage/')
response.set_cookie('user', username, 3600) # 添加浏览器cookie
return response
else:
return render(request,'index.html', {'error': 'username or password
error!'})
# 发布会管理
def event_manage(request):
username = request.COOKIES.get('user', '') # 读取浏览器cookie
return render(request,"event_manage.html",{"user":username})

<div style="float:right;">
<a>嘿!{{ user }} 欢迎</a><hr/>
</div>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值