cookie和session

一:会话技术简介

  1. 存储客户端的状态。例如:用户在商城上面购物,服务端如何针对不同的客户端进行信息的存储呢?访问的信息存放在哪里?因为http协议是无状态的,所以客户端访问服务器的时候服务器并不知道是哪个客户端,所以需要会话技术进行识别客户端的装态。说白了会话技术就是使服务器能够记住客户端的状态(区分客户端)。
  2. 会话技术:浏览器打开访问其中的某个站点,直到浏览器关闭的整个过程,称为一次会话。会话技术就是记录客户端在这次会话中的数据和状态。会话技术分为cookie和session,session和cookie的作用都是为了保持客户端和服务端的交互状态。
    •   cookie:将服务端返回的响应信息以key/value的方式存储在客户端。减少服务端的压力,但是安全性不好,因为客户端可以删除 cookie信息。而且客户端存储cookie的大小不能超过4k,一台浏览器最多存储50个cookie,低版本的可能存储20个cookie。
    •   session:恰恰和cookie相反。session是将数据存储在服务端,相对安全,但是增加了服务端的压力。主要用在解决服务器之间共享的问题  

二:cookie技术

 cookie是将用户的信息保存在客户端的会话技术

  创建cookie的条件:

    • cookie的name值不能和set-cookie中的属性值一样
    • cookie的name值和value的值不能为非Assic码。如果cookie中存在中文,需要使用URLEncode进行编码,否则程序运行会出现异常
    • cookie中的name和value的值出现Token字符(、, \ 等),会将cookie中的version设置为1(cookie存在两个版本,版本0,版本1)。    
  1.  服务端如何将cookie返回给客户端?
    1. 创建cookie对象 :Cookie cookie = new Cookie(cookieName,cookieValue);cookie会以响应头(set-cookie)的方式返回给客户端
    2. 设置cookie的过期时间:cookie.setMaxAge(毫秒值): 注意:如果不设置cookie的持久化时间,cookie信息会保存在浏览器的内存中,如果浏览器关闭,cookie就销毁(会话技术),如果设置过期时间,cookie信息会被持久化到浏览器磁盘文件中,直到cookie过期,cookie销毁。
    3. 设置携带cookie的路径:setPath("/"); 如果不设置携带cookie的路径,那么访问创建cookie路径下的所有资源都会携带cookie信息。例如:创建的cookie路径是:/web应用/servlet1     ,那么访问 /web应用/servlet1 下的任何资源都会携带cookie
    4. 将创建的cookie发送给客户端  ; response.addCookie(cookie);会在客户端响应该cookie 

 图解cookie的存储过程

 三:session技术

  • 为什么会有session?

  session出现的原因是:服务端返回给客户端的cookie过多,服务端和客户端的进行传输通信增加,影响性能,session的出现就是为了解决这一问题。在客户端域服务端进行交互的时候,不必要每次都返回cookie,只需要给客户端一个唯一标识的id即可(JSESSIONID),这个ID值就是name为JSESSIONID的cookie。

  • 什么是session?

   session会话技术是存储在服务端的会话技术。客户端每次访问时,会在服务端创建一小块内存,用来保存客户端的信息,要求客户端携带JSESSOIONID去寻找属于自己的一小块内存。session需要借助cookie存储的JSESSIONID值。问题是:如果存储的session过多,造成服务端的压力过大,效率降低。

  • 如何使用session?

  1.获取session 

  HttpSession session = request.getSession();

  这句话是获得属于当前会话的session对象。如果该session对象已经存在,就直接返回;如果不存在,就会创建新的session对象返回(原理是:根据客户端携带的JSESSIONID寻找服务端是否有该session)

  2.向session对象中存取数据

  因为session是域对象,所有有通用的三个方法

  session.setAttribute(String ,string)

  session.getAttribute(String)

  session. removeAttribute(String)

  3.session对象的生命周期

  创建:执行request.getSession()开始创建session对象

  销毁:

  (1)session过期,默认30分钟,

  (2)在服务器(非正常)关闭时销毁。

   (3)手动销毁session:使用session.invalidate();

  作用范围:默认在一次会话中,也即在一次会话中的所有资源共用一个session对象

浏览器关闭不等于session销毁!!!   因为session技术是基于cookie技术实现,重启浏览器在次访问原来的连接依然会创建新的session对象。因为cookie默认在浏览器关闭时消失,也就意味着JSESSIONID找不到了。但是原来的session对象还在服务端存储,只是再也找不到了(没有了JSESSIONID),只有等到session自动销毁。

  图解session的存储过程

总结:session和cookie都是为了保持(记录)用户的访问状态,一方面是为了业务功能的简单实现,另一方面是为了简化服务端程序设计。

分布式session:解决的是session共享的问题。例如在tomcat下有两个应用:web1和web2,访问web1会创建一个session对象session1,访问web2会创建session对象session2,在不同的应用中session是不共享的,要想解决session共享,就需要考虑使用分布式session解决。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在CentOS 6.5上使用Unicorn和Nginx部署Rails应用程序

在部署基于Rails的Web应用程序时,简单设计的应用程序服务器可以在几分钟内启动并运行。但是,如果您希望更好地控制服务器设置或想要尝试更灵活的新功能,那么使用...

1242
来自专栏Java成长之路

Java线程调度与线程优先级

线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种,分别是协同式线程调度和抢占式线程调度。

1522
来自专栏静晴轩

详解 Cookie 纪要

从事 Web 开发已有近17个月;在学以致用的工作学习里,对于不怎么使用的部分,多少有些雾里探花的窘迫感~差不多是了解一二,然而又非真切的明晰;这就使得再用的时...

3429
来自专栏帅小子的日常

cookie和session

3425
来自专栏崔庆才的专栏

HTTP基本原理

在本节我们会详细了解 HTTP 的基本原理,了解在浏览器中敲入一个 URL 到获取网页内容发生了一个怎样的过程,了解了这些内容,有助于去进一步了解爬虫的基本原理...

3128
来自专栏Python

cookie详解

今天看到一篇cookie的文章,写的特别详细,感谢 晚晴幽草轩 的分享,原文链接http://mp.weixin.qq.com/s/NXrH7R8y2Dqxs9...

3553
来自专栏Java架构沉思录

OAuth 2.0是什么?看这篇文章就够了。

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。

893
来自专栏小尘哥的专栏

springboot中redis的使用和分布式session共享问题

本文旨在解决分布式系统的session如何共享问题,大致思路:session放入redis。其他解决方案:持久化、放cache等都可以,但是自从有了redis,...

783
来自专栏PHP在线

Session原理简述

Session存在的意义,估计每个做web开发的人都是了解的,就为了解决HTTP是无状态协议所带来的问题,不多说了。这里主要想说的是服务端与客户端是如何利用se...

3316
来自专栏Java学习网

理解OAuth 2.0

  OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。   本文对OAuth 2.0的设计思路和...

3544

扫码关注云+社区