session 及 cookie 学习笔记(用于记录查阅)

1. session机制:一类用来在客户端与服务器之间保持状态的解决方案

2. java中,session用来指代该语言的解决方案,如java中经常提及的HttpSession

3. Cookiesession的区别:

   1) cookie用于在客户端保持状态,举例说明:

     用户在咖啡店买五杯咖啡送一杯的优惠,咖啡店发给客户一张卡片,上边记录咖啡消费数量,一般存在活动有效期,每次消费时,如果客户出示该卡片,则此次消费与之前的消费和以后的消费相联系起来。此种做法则为在客户端保持状态,因为卡片在客户手上

   2) session用于在服务端保持状态,举例说明:

     咖啡店给用于发放一张会员卡,仅记录会员卡号,客户每次消费时,出示改卡,店员则会在会员卡记录本上找到这个卡号的消费记录,并添加本次消费记录。此种做法则为在服务端保持状态,因为会员卡相关记录信息由咖啡店维护。

   由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择

   3) cookie内容包括:名字,值,过期时间,路径,域

     不设置有效期时,则表示该cookie的生命周期为浏览器会话期间,关闭浏览器,则该cookie消失。

   4) session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 

原理分析: 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识- 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session idsession id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 

4. cookie工作流程:

>1. servlet创建cookie,保存少量数据,发送浏览器。

   >2.浏览器获得服务器发送的cookie数据,将自动的保存到浏览器端。

     >3. 下次访问时,浏览器将自动携带cookie数据发送给服务器。

5.  cookie操作

 >1.创建cookienew Cookie(name,value)

  >2.发送cookie到浏览器:HttpServletResponse.addCookie(Cookie)

 >3.servlet接收cookieHttpServletRequest.getCookies() 浏览器发送的所有cookie

6. cookie特点

       >1. 每一个cookie文件大小:4kb, 如果超过4kb浏览器不识别

       >2. 一个web站点(web项目):发送20

       >3.一个浏览器保存总大小:300

       >4.cookie 不安全,可能泄露用户信息。浏览器支持禁用cookie操作。

       >5. 默认情况生命周期:与浏览器会话一样,当浏览器关闭时cookie销毁的。---临时cookie

7. cookie api

 1> getName() 获得名称,cookie中的key

 2> getValue() 获得值,cookie中的value

 3> setValue(java.lang.String newValue)  设置内容,用于修改key对应的value值。

 4> setMaxAge(int expiry) 设置有效时间【默认为-1

 5> setPath(java.lang.String uri)  设置路径【】  

 6> setDomain(java.lang.String pattern) 设置域名 , 一般无效,有浏览器自动设置,setDomain(".itheima.com"),www.itheima.com / bbs.itheima.com都可以访问,a.b.itheima.com无法访问作用:设置cookie的作用范围,域名+路径在一起就构成了cookie的作用范围,上面单独设置的setPath有用,是因为有浏览器自动设置该域名属性,但是我们必须知道有这么个属性进行域名设置的

 7> isHttpOnly()  是否只是http协议使用。只能servlet的通过getCookies()获得,javascript不能获得。

 8> setComment(java.lang.String purpose) (了解)//对该cookie进行描述的信息(说明作用),浏览器显示cookie信息时能看到

 9> setSecure(boolean flag) (了解)  是否使用安全传输协议。为true时,只有当是https请求连接时cookie才会发送给服务器端,而http时不会,但是服务端还是可以发送给浏览端的。

注意:cookie不能发送中文,如果要发送中文,就需要进行特别处理。

JDK提供工具,进行编码

URLEncoder:编码

URLDecoder:解码

//发送cookie

Cookie cookie = new Cookie(URLEncoder.encode("哈哈"),URLEncoder.encode("呵呵"));

response.addCookie(cookie);

//获得cookie中文内容

URLDecoder.decoder(request.getCookie().getName);//获取key

URLDecoder.decoder(request.getCookie().getValue);//获取value

8. session 操作:

   1> 获取session:

      request.getSession(); //等效于request.getSession(true),当未获取到对应的session时,创建一个新的session,若为fasle,则当未获取到session时,返回Null.(为什么要从request中获取session,可以理解为,在获取session时,需要检测请求中是否有session标识,所以需要用request来获取)。

   2> 属性操作:

      setAttrubute(key,value);

 getAttribute(key);

       用来存放一些信息,然后才能共享信息 

   3> 是否浏览器关闭,session就失效?

      其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,一般是30分钟,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间

    4> session有效时间控制:

      1) session.invalidate()    --> 手动将session对象销毁

      2) .setMaxInactiveInterval(int interval)     -->设置session失效时长,单位秒(默认30分钟)

      3) web.xml中配置session的有效时长

         <session-config>

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

         </session-config>

    5> session的生命周期:

       1) 创建:第一次调用getSession()

       2) 销毁:销毁存在如下三种情况

           -->超过session的有效时长

           -->手动执行销毁操作

           -->服务器非正常关闭(直接将jvm关闭)

6> 当浏览器禁用cookie时,基于cookiesession将不能正常工作,每次使用request.getSession()时都会创建一个新session,达不到session共享数据的目的,此时,只需要将session id传递给服务器session就可以正常。

   解决方案:

      手动方式: url + ;jsessionid=....

      自动方式: encodeURL(java.lang.String url)进行所有URL重写

 encodeRedirectURL(java.lang.String url) 进行重定向 URL重写

7> session持久化:

  --> Session对象的信息一般情况下置于服务器的内存中,当服务器由于故障重启,或应用重新加载 时候,此时的Session信息将全部丢失。为了避免这样的情况,在某些场合可以将服务器的Session数据存放在文件系统或数据库中,这样的操作称为Session对象的持久化。

  --> 要完成session持久化,存放在session里的对象必须要实现java.io.Serializable 接口。Session的持久化是由Session Manager来管理的。Tomcat提供了两个实现类:

org.apache.catalina.session.StandardManager  (默认)

org.apache.catalina.session.PersistentManager (暂时不看)

      --> tomcat默认启用持久化配置,若要禁用,则需要在tomcat下的conf文件夹下的context.xml中的<Context>节点里配置<Manager pathname=”” />

      --> StandardManager  (StandardManager是默认的Session Manager。它的实现机制为:当Tomcat服务器关闭或重启,或者Web应用被重新加载时,会对在内存中的HttpSession对象进行持久化, 并把它们保存到文件系统中,默认的文件为<CATALINA_HOME>/work/Catalina/hostname/ applicationname/SESSIONS.ser)

         1) 全局配置: context.xml中配置如下标签

<Manager

className=”org.apache.catalina.session.StandardManager”

debug=”0”

maxInactiveInterval=”-1″

/>

2) 针对某一站点配置则需要在cof文件夹server.xml<Host><Context>

节点中添加<Manager>配置。

9. 总结:

>>>cookie是一种在客户端记录用户信息的技术,因为http协议是无状态的,为了解决这个问题而产生了cookie。记录用户名等一些应用信息

>>>session是一种在服务端记录用户信息的技术,一般session用来在服务器端共享数据

>>>cookie工作原理cookie是由服务器端创建发送回浏览器端的,并且每次请求服务器都会将cookie带过去,以便服务器知道该用户是哪一个。其cookie中是使用键值对来存储信息的,并且一个cookie只能存储一个键值对。所以在获取cookie时,是会获取到所有的cookie,然后从其中遍历。

>>>session的工作原理就是依靠cookie来做支撑,第一次使用request.getSession()session被创建,并且会为该session创建一个独一无二的sessionid存放到cookie中,然后发送会浏览器端,浏览器端每次请求时,都会带着这个sessionid,服务器就会认识该sessionid,知道了sessionid就找得到哪个session。以此来达到共享数据的目的。 这里需要注意的是,session不会随着浏览器的关闭而死亡,而是等待超时时间。

Cookie存储位置不同的影响:

内存cookie,是指没有设在cookieExpires的属性,此时cookie将停留在客户端的内存中,只有在该IE窗口中从文件-新建- 窗口打开的新的IE窗和由formtarget属性为_blank产生的新的IE窗口才共享同一个cookie信息。IEChome的选项卡都共享同一个cookie信息。

 

硬盘cookie,是指在你设置了cookieExpires属性,此时cookie将保存到你的硬盘上,Win7是在C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies 下面(如果你是Administrator账号的话)。此时所有的窗口将共享同一个名字的cookie

 

      

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值