COOKIE和SESSION

Java小课堂

分享人:何东霖

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

HTTP协议的无状态性

有状态

A:你今天中午吃的啥?

B:吃的大盘鸡。

A:味道怎么样呀?

B:还不错,挺好吃的。

无状态

A:你今天中午吃的啥?

B:吃的大盘鸡。

A:味道怎么样呀?

B:啊?啥?啥味道怎么样?

cookie和session存在的意义就是为了保存http协议客户端/服务器间的部分有用的状态

无状态加持cookie机制

A:你今天中午吃的啥?

B:吃的大盘鸡。

A:你今天中午吃的大盘鸡味道怎么样呀?

B:还不错,挺好吃的。

cookie和session

假如一个咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。

1、发给顾客一张卡片,上面用印章记录着消费的数量,一般卡片还有个有效期限。每次喝咖啡时,顾客出示这张卡片,店员就在卡片上盖个章。

2、发给顾客一张会员卡,会员卡上有唯一标识的卡号,每次消费时,顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。

顾客就相当于客户端浏览器,店员相当于服务器。方案一就是在客户端保持状态。也就是cookie;方案二是在服务器端保持状态,也就是session。

cookie

Cookie 是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器内存或用户本地硬盘(客户端)上的小文本文件(内容通常经过加密),它可以包含有关用户的信息。无论何时用户链接到服务器,Web站点都可以访问 Cookie 信息

session

Session机制是一种服务端的机制,服务器使用一种类似散列表的结构来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端里的请求里是否已包含了一个session标识--sessionID,如果已经包含一个sessionID,则说明以前已经为此客户端创建过session,服务器就按照sessionID把这个session检索出来使用(检索不到,可能会新建一个),如果客户端请求不包含sessionID,则为此客户端创建一个session并且声称一个与此session相关联的sessionID,sessionID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串(服务器会自动创建),这个sessionID将被在本次响应中返回给客户端保存。

2.知识剖析

怎么应用cookie

学习cookie需要掌握的两个要点

1、cookie的发放和读取过程

2、cookie的常用方法(API)

cookie的发放和读取

cookie的发放是通过扩展HTTP协议来实现的,服务器端通过在HTTP的响应中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。

利用HttpServletRespones的addCookie()方法将它设置到客户端

被该服务器设置过cookie的客户端之后的每次访问都会在请求头上携带该cookie的信息(只要在设置的路径范围内)

利用HttpServletRequest的getCookie()方法来读取客户端的Cookie,返回一个Cookie数组

cookie的常用API及注意事项

1.Cookie有效期:使用setMaxAge()方法设置

2.Cookie有效域:setDomain(String domain)/getDomain()

3.Cookie有效路径:setPath(String uri)/getPath()

怎么应用session

学习session需要掌握的两个要点

1、理解sessionid

2、session的常用方法(API)

对sessionid的理解

sessionid是作为服务器识别客户端的手段而出现的,session是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户

sessionid的载体有三种:

1、使用cookie(默认、最常用)

2、URL重写的方式(针对cookie被禁的情况)

3、在页面表单里面增加隐藏域(和第二种的区别是它使用post)

session的常用方法(API)及注意事项

1、setAttrubute(String name,Object value)/getAttrubute(String name)

2、session.setMaxInactiveInterval();参数单位是秒

Cookie和Session之间的区别

1.Cookie数据存放在客户的浏览器(本地),session数据放在服务器上

2.Cookie不如session安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,所以出于安全性的考虑应当使用Session

3.Session会在一定时间内保存在服务器上。当访问增多,会占用较多的服务器资源,所以出于性能考虑则应当使用cookie

4.session因为是保存在服务器上,所以不支持跨域的访问

3.常见问题

1、配置服务器集群情况下客户端拿不到session的问题

2、相同域下sessionid覆盖的问题

4.解决方案

1、使用nginx负载均衡策略中的ip_hash设置,每个请求按访问ip的hash结果进行分配,这样可以使每一个访客固定访问一个后端服务器。

2、在web服务器的配置中可以修改自动分配的sessionid的key

5.编码实战

6.扩展思考

token

7.参考文献

1.CSDN博客:https://blog.csdn.net/cxzhq2002/article/details/750148

师兄的PPT

8.更多讨论

今天的分享就到这里啦,欢迎大家提问和探讨!