cookie和session

l什么是会话?
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
l会话过程中要解决的一些问题?
每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据。
例如:用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户商品为用户结帐。


什么是cookie

服务器可以根据cookie来跟踪客户的状态,这对于需要区别客户的场合(如电子商务)也别有用。

打个比方:

健身馆向来报名的会员发送一张会员卡,会员卡上存储了客户的编号、姓名和照片信息。以后每次客户到健身房来健身的时候,要先出示会员卡,健身馆要依据会员的会员卡信息来判断是否允许客户在场地健身。


下面是cookie的基本运行机制:


  • Cookie

        Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。


  • Session
        Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

TipCookie细节

  1. 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  2. 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  3. 浏览器一般只允许存放300Cookie每个站点最多存放20Cookie,每个Cookie的大小限制为4KB
  4. 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。
  5. 删除持久cookie,可以将cookie最大时效设为0注意,删除cookie时,path必须一致,否则不会删除

Tip session
  1. 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
  2. Session和Cookie的主要区别在于:
  3. Cookie是把用户的数据写给用户的浏览器。
  4. Session技术把用户的数据写到用户独占的session中(服务器端)。
  5. Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
session 的原理:
服务器端会为每个session对象创建一个单独的session对象。
原理就是为每个session对象创建一个sessionid,用这个唯一的sessionid来实现每个浏览器独占session对象。

如图:


1.浏览器A第一次访问服务器servlet1程序时,服务器为他创建一个session对象,并赋值一个sessionid=111,并在响应时,自动的会在cookie中添加信    息jsessionid=111,浏览器会在自己的缓存区存放cookie的信息,jsessionid=111的信息就存放在浏览器缓存了。 

2.当浏览器A第二次访问服务器servlet2程序时,会自动携带cookie中的信息jsessionid=111在请求信息中,服务器会根据这个sessionid找到服务器中存在sessionid=111的那个session对象。

3.浏览器B第一次访问服务器servlet1程序时,服务器为他创建一个session对象,并赋值一个sessionid=111,并在响应时,自动的会在cookie中添加信息jsessionid=111,浏览器会在自己的缓存区存放cookie的信息,jsessionid=111的信息就存放在浏览器缓存了。 

4.当浏览器B第二次访问服务器servlet2程序时,

会自动携带cookie中的信息jsessionid=111在请求信息中,服务器会根据这个sessionid找到服务器中存在sessionid=111的那个session对象。


用给每个浏览器在服务器上的session对象标识唯一的sessionid,访问时通过cookiexie传输jsessionid信息来达到独享的目的。

问题:如何实现 关掉浏览器后,再开浏览器,上次购买的商品还在?

因为session是会话级别的,关掉浏览器之后当前会话就关闭了,在浏览器缓存cookie中的jsessionid就丢失了,只要能长久保存jsessionid就可以根据原来的jsessionid在服务器端找到响应的session对象。



  • 浏览器禁用cookie后 session的追踪
如果浏览器禁用了cookie之后,session还能继续使用么?        答 : 可以的

 * 禁用cookie之后,浏览器无法保存cookie的的jsessionid,无法完成session的追踪。


------------------------------------------------------------我是快乐的分割线-------------------------------------------------------------------------

改变cookie的共享范围

假定在Tomcat服务器A上有一个app1应用和一个app2应,在TomcatB服务器上有一个app3应用。用户会通过同一个浏览器进程访问app1,app2 和 app3 应用。




假定aap1应用的一个web组件在浏览器上保存了一个Cookie,当浏览器再次请求访问app1 , app2 和 app3应用中的其他web组件时,浏览器是否会把cookie添加到HTTP请求中,从而让这些web组件也能读取到该Cookie呢?

在默认的情况下,出于安全的原因,只有app1 应用中的web组件才能够读取到该cookie,如果希望改变cookie的共享范围,那么app1应用中的web组件X在写Cookie时,可以通过setPath(String path) 和 setDomain(String domain) 方法来设置Cookie的path和domain属性.

  • 让同一个Tomcat服务器A中的app1应用和app2应用共享Cookie。app1应用中的Web组件X的写Cookie的代码如下:
<pre name="code" class="java">Cookie cookie  = new Cookie("username","Tom");
cookie.setPath("/");
response.addCookie(cookie);

 
  
以上setPath()的参数 "/",表示Tocat服务器的根路径,因此同一个Tomcat服务器中的所有web应用可以共享上述的Cookie。

  • 只能让Tomcat服务器A中的app2应用访问Cookie。app1应用中的web组件X的写Cookie代码如下:


<pre name="code" class="java">Cookie cookie  = new Cookie("username","Tom");
cookie.setPath("/app2/");
response.addCookie(cookie);

 


以上setPath()的参数 "/app2",因此只有Tomcat服务器A中的app2应用可以访问该Cookie,app1应用的也无法访问该Cookie。


  • 只能让Tomcat服务器A中的aap1应用中的位于"/sub"子路径下的Web组件访问Cookie。app1应用中的组件X的写Cookie的代码如下:

Cookie cookie  = new Cookie("username","Tom");
cookie.setPath("/app1/sub/");
response.addCookie(cookie);

以上setPath()的参数 "/app1/sub/",因此只有Tomcat服务器A中的app1应用中位于"/sub"子路径下的Web组件能访问Cookie。加入app1应用的一个微博组件的URl为"/sub/hello",那么他可以访问该Cookie;如果URL为"/hello",则不可以方位该Cookie


  • 让Tomcat服务器B中的所有的Web应用访问Cookie,假定Tomcat服务器B的域名为"www.cat.com".app1应用中的web组件X的写Cookie的代码如下:
Cookie cookie  = new Cookie("username","Tom");
<span style="color:#ff0000;">cookie.setDomain(".cat.com");</span>
response.addCookie(cookie);

以上setDomain()的参数为".cat.com",该参数必须是以“.”开头,参数的具体格式可以参考RFC2109文档。点击打开链接
以上设置是的Tomcat服务器B中的所有web应用能访问该Cookie。如果仅仅希望Tomcat服务器B中的app3应用访问该Cookie,那么可以把代码改写为:


Cookie cookie  = new Cookie("username","Tom");
<span style="color:#ff0000;">cookie.setDomain(".cat.com");
cookie.setPath("/app3/");</span>
response.addCookie(cookie);






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值