Cookie与session

HTTP无状态协议
说这两种技术之前,就不得不说HTTP的无状态协议:指协议对事务没有记忆功能,即每次用户请求/响应,该协议不能区分是上次请求的用户,还是新用户,即每次用户请求服务器都响应,但对用户请求没有记录。这种协议并不能满足交互式程序的需要,于是就诞生两种技术来实现保持HTTP状态,即可以识别是不是同一个用户。
Session
Session是在服务器端保存用户状态的一种技术,它的生命周期是一次完整的会话。当用户首次请求服务器时,服务器会为该用户创建一个session,后台服务器可以设置把用户的信息存储在session域中,然后在响应的时候,附带返回一个sessionid给用户,浏览器会以键值对的形式存储在cookie中,且该cookie的访问权限是该工程或后台自己设置该工程下其他路径。其中tomcat默认是”JSESSIONID”存储在Cookie中,当用户首次请求后,服务器响应会把sessionid值以JSESSION:sessionid形式存储在cookie中。
Cookie
Cookie是在客户端保持用户状态的一种技术,Cookie分为persistent Cookie与 session Cookie,前者是保存在用户磁盘中,下次使用如果没有过期还可以读取使用;后者只会保存在浏览器内存中,会话结束(浏览器关闭并不是关闭该选项卡)也就消失。cookie中信息以字符串的形式存储,每次用户请求程序浏览器会自动(如果有,没有则请求响应后创建cookie)带上Cookie中的唯一标识用户的信息(JSESSIONID)。
Cookie与Session配合来保持用户状态
用户第一次登录系统发出请求,服务器发现没有携带JSESSIONID,则会为用户创建一个Session,同时在响应后,把SessionID作为用户标识填充在response响应头中的cookie域中,浏览器客户端在收到响应后为用户在浏览器中创建保存Cookie,这样用户后面每次请求服务器浏览器都会自动附带上Cookie中的内容,这样后台服务器在接收请求的时候验证Cookie中的标识JSESSIONID来查找是否有SessionID值等于此值,如果有则表示用户已经访问过,否则就创建一个session,过程与首次登陆一样。这样Cookie技术与Session技术配合使用,就完成了保持用户状态。
其它问题
同一个浏览器同一个应用同一个用户Cookie共用问题:
首先是同一个浏览器比如Chrome,不论你是从快捷方式打开多个还是从一个窗口中打开多个选项卡,都不会影响此种情况;
同一个应用:比如一个系统网站
同一个用户:一个windows 用户或者一个别的操作系统用户(排除系统中装虚拟机系统用户)
浏览器会出现这样一种情况:
当用户用同一种浏览器用多个账号登录系统时,浏览器会把所有的该应用的用户共用Cookie,这样你发现后面登陆的用户会携带前,面登陆的用户Cookie(含JSESSIONID),这样服务器就会认为已经访问过用户,这样的虽然可以后台改写session域的值来匹配此用户,但前一个登陆的用户Session域中的值就会被后面覆盖了。即后面与前面一个用户共用session和cookie了。(不知道有没有解决的方法)
用户浏览器禁用Cookie
有些用户浏览器禁用Cookie,那么这种方式就不可行了。但是会有别的方式实现:隐藏标签(form中有一个hidden标签。name=“JSESSIONID”,值为sessionId值,后台就会解析出sessionid来验证用户是否登陆过)、URL重写(在jsp页面可以通过修改URL比如“<%=response.encodeUrl(“rewriteURL.do”)%>”“”)来实现重写url这样返回就会在url后台携带JSESSIONID:rewriteURL.do;jsessionID=D8F20086873C8F1CE44B31E7DA1FF574的形式返回,这样用于就可以获得Jsession 但是可能会出现sessionID泄漏问题。
禁用cookie后,使用ajax请求后台,会发现由于没有携带cookie每次请求都会创建一个新的session,如果使用url重写则不会在ajax中返回结果中也可以获取请求头中的信息(也可以是后台添加的键值对)比如:
success:function(data,status, xhr){
alert(xhr.getResponseHeader(“Set-Cookie”));//由于默认是HttpOnly,因此js脚本会获取为null,这里用id来传来并获取sessionid
alert(xhr.getResponseHeader(“Content-Type”));
alert(xhr.getResponseHeader(“id”));
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值