导航

Session和Cookie

Posted on 2019-03-31 21:19  ydc198  阅读(84)  评论(0编辑  收藏  举报

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

1、无状态的HTTP协议:

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。

HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。

  2、会话(Session)跟踪:

  会话,指用户登录网站后的一系列动作,比如浏览商品添加到购物车并购买。会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。

1.Cookie
     Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。典型使用场景就是保存帐号密码。

Cookie是浏览器保存信息的一种方式,可以理解为一个文件,保存到客户端,服务器可以通过响应浏览器的set-cookie的标头,得到Cookie的信息。你可以给这个文件设置一个期限,这个期限呢,不会因为浏览器的关闭而消失啊。其实大家应该对这个效果不陌生,很多购物网站都是这个做的,例如打开淘宝即使你没有买东西,他也记住了你的喜好,现在回来,会优先给你提交你喜欢的东西。

COOKIE的操作

添加

Cookie cookie = new Cookie("user", "uName");
cookie.setMaxAge(7*24*60*60); // 一星期有效
response.addCookie(cookie);
获取

// 因为取得的是整个网页作用域的Cookie的值,所以得到的是个数组
Cookie[] cookies = request.getCookies();
for(int i = 0 ; i < cookies.length ; i++){
String name = cookies[i].getName() ;
String value = cookies[i].getValue() ;

2.Session
    由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session典型的场景就是购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特点的用户创建特点的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车有什么东西。这个Session是保存在服务端的,有唯一标识,在服务器端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候Session信息都是放在内存,使用一些缓存服务比如Memcached子类来放Session。

3.HTTPSession会话机制
    创建服务器端,保存于服务器,维护于服务器端,每创建一个新的Session,服务器端都会分配一个唯一的ID,并且把这个ID保存在客户端的Cookie中,保存形式是JSESSIONID来保存的。

通过HttpServletRequest.getSession 进行获得HttpSession对象,通过setAttribute()给会话赋值,可以通过invalidate()将其失效。
每一个HttpSession有一个唯一的标识SessionID,只要同一次打开的浏览器通过request获取到session都是同一个。
WEB容器默认的是用Cookie机制保存SessionID到客户端,并将此Cookie设置为关闭浏览器失效,Cookie名称为:JSESSIONID
每次请求通过读取Cookie中的SessionID获取相对应的Session会话
HttpSession的数据保存在服务器端,所以不要保存数据量耗资源很大的数据资源,必要时可以将属性移除或者设置为失效
HttpSession可以通过setMaxInactiveInterval()设置失效时间(秒)或者在web.xml中配置
<session-config>

<session-timeout>30</session-timeout>

</session-config>
HttpSession默认使用Cookie进行保存SessionID,当客户端禁用了Cookie之后,可以通过URL重写的方式进行实现。
    可以通过response.encodeURL(url) 进行实现

    API对encodeURL的结束为,当浏览器支持Cookie时,url不做任何处理;当浏览器不支持Cookie的时候,将会重写URL将SessionID  拼 接到访问地址后。

4.区别
cookie 和session 的区别:

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

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

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

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

5、所以个人建议:
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE中
---------------------
转自:https://blog.csdn.net/qq_29477223/article/details/81745815