cookie和session是为了解决什么问题产生的?

1.第一点想要了解一样技术必须了解它的哲学,也就是这项技术是为了解决什么问题而诞生的它存在的意义是什么?

因为HTTP是无连接的,当请求结束连接就会中断所以会产生身份识别的问题。

因此诞生了cookie甚至于在localStorage出现之前浏览器存储功能都是依靠cookie来完成的

但是它的原理简单到爆,一句话就是当浏览器访问服务器时,服务器会向浏览器发送一个cookie

可以理解为标识符,下次浏览器再向服务器发送请求时在上行报文中携带这个标识符(cookie)

服务器就能够根据标识符做出识别,当服务器在下行报文中设置kookie的持续时间

那么浏览器在一定时间内访问该服务器都会携带这个cookie,kookie的本意是曲奇,老外喜欢拿饼干做信物

所以kookie就是一个浏览器跟服务器通讯的信物,如果是中国人发明可能就是黑话,这个基础是建立在HTTP无连接

那么有了cookie,为什么还要有session呢?有了cookie可以向服务器证明用户身份了,我们的web系统中是不是需要将用户的详细信息储存在某个位置供页面调用呢?用户的详细信息就包括姓名,年龄,性别等信息。而cookie是存在于客户端的,将用户详细信息通过网络发送到客户端保存是极不安全的。且cookie大小不能超过4k,不能支持中文。这就限制cookie不能满足存储用户信息的需求。这就需要一种机制在服务器端的某个域中存储一些数据,这个域就是session。
总而言之,cookie/session的出现就是为了解决http协议无状态的弊端,为了让客户端和服务端建立长久联系而出现的。

2.什么是会话技术?

帮你存储一些在交互过程临时产生的数据

当你打开浏览器,访问一个网站,认为会话开始了,当你关闭浏览器的时候,会话结束了

3.cookie/session执行流程(这才是重点)

cookie执行流程

当你去访问应用的时候,来到服务器。服务器设置一个cookie(后边介绍api),在做响应的时候会通过set-cookie响应头将cookie带给浏览器。

来到浏览器,浏览器会将此数据保存起来,接下来再次去访问服务器的时候,浏览器会根据cookie的path属性(后边api介绍)将这些数据带回去(设置了一个叫做cookie的请求头),来到服务器,服务器有对应的api获取这些值,有了值就知道用户是谁了。

session执行流程

浏览器发起一个请求到服务器,服务器先检查你是否携带了一个叫做JSESSIONID的cookie。

如果有携带,会将此cookie的值取出来(比如为aaa123),然后从服务器的session池中找到ID为aaa123的session返回给调用者。

如果没有携带这个JSESSIONID的cookie,那么服务器将会自动创建一个session对象并且生成一个随机字符串(如aaa123)作为此session的ID保存到session池中。在服务器为客户端浏览器作响应的时候自动创建一个键为“JSESSIONID” 值为“aaa123”的cookie对象让浏览器储存起来以便下次再访问的时候带过来。

4.cookie的常用属性api

        Cookie cookie = new Cookie("name","tom"); // 新建Cookie

cookie就是键值对的数据,如果是中文不能直接设置,需要编码

        cookie.setDomain("www.baidu.com"); // 设置域名

这样设置域名的话,该cookie会被提交到www.baidu.com但是不会被提交到zhidao.baidu.com。要想都提交过去,需要这样设置cookie.setDomain(".baidu.com");

        cookie.setPath("/search"); // 设置路径   

这样设置路径,该cookie只会被提交到www.baidu.com/search路径下的页面,也就是说在www.baidu.com/aaa下的页面是获取不到该cookie的。一般cookie在某个网站里都是可用的,直接设置为/,cookie.setPath("/");

        cookie.setMaxAge(60*60*24*7); // 设置有效期

MaxAge属性单位为秒,默认为-1也就是关闭浏览器自动销毁。cookie.setMaxAge(60*60*24*7); 这样设置意思是不管浏览器关闭与否,将此cookie持久化到客户端文件里保存一周。参数为正数时浏览器都会将相应的cookie做持久化处理。

        response.addCookie(cookie); // 输出到客户端

5.session常用api

HttpSession session = request.getSession(); // 创建session

session.setAttribute("name","tom"); // 设置Session属性

out.println("欢迎您:" +session.getAttribute("name")); // 获取Session属性

在tomcat配置文件中配置session的超时时间
            <session-config>
                <session-timeout>分钟为单位</session-timeout>
            </session-config>

6.cookie/session的区别与联系

区别:

1.cookie存放在客户端,session存放在服务器端。

2.cookie只能存放4k的数据,而session理论上没有做限制

联系:

session虽说存放在服务器端,但是仔细看刚才的执行流程你会明白,session是依赖于cookie的,这一点也是本篇文章想要着重强调的

7.cookie/session使用注意事项

1.cookie大小有限制 4k

2.cookie不能跨浏览器

3.cookie不支持中文

4.如果是安全性较高的数据应存放在session中,因为cookie存放在客户端总会轻易被不法分子获取

5.如果是访问量特别大的网站,尽量不要在session中存储用户数据,因为每个用户存一个session会给服务器造成很大的压力

8.新手使用session时常踩的坑

很多人使用session时希望用户信息可以保存一段时间比如保存7天,于是配置了Tomcat的

<session-config>

        <session-timeout>7天</session-timeout>

</session-config>。

配置完后发现,关闭浏览器后再访问还是取不到session。这是因为session的配置没起作用吗?不是的,其实session还是存在于服务器的,只是没有设置cookie持久化,cookie默认就会在浏览器关闭时销毁,所以叫做JSESSIONID的cookie也被销毁了,再到服务器的时候没有这个叫JSESSIONID的cookie就取不到相关的session了。

所以,如果想7天内都能访问到session,需要将cookie也设置持久化!
————————————————
版权声明:本文为CSDN博主「IT_zhang81」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/IT_zhang81/article/details/81776956

 

posted @ 2020-03-29 21:09  灰太狼&红太狼  阅读(1575)  评论(0编辑  收藏  举报