Cookie与session

一.cookie属性项(version 1)

属性项 属性值介绍
NAME=VALUIE 键值对,可以设置保存的key/value
Version 版本号
Comment 注释项
CommentURL 服务器为此cookie提供的url注释
Discard 是否在会话结束后丢该cookie项,默认为false
Domain 生成该cookie的域名
Max-Age 最大失效时间
Path 该cookie是在当前哪个路径下生成的
Port 该cookie在什么端口可以回传服务器,如果多个端口,用逗号隔开,例:Port="80,81,8080"
Secure 如果设置了这个属性,那么只会在SSH连接时才会回传该Cookie

 

 

 

 

 

 

 

 

二.Cookie如何工作

创建cookie:

response.addCookie(new Cookie("username","lzl"));

取值:

Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("userid")) {
      String userid = cookie.getValue();       。。。。 break; } } } }
注意:创建cookie的name和value的值必须是ASSIC字符,如果要使用中文,可以通过URLEncoder将其编码,否则会抛出异常:IllegalArgumentException
三.Session
1.sessionId
  通过三种方式让session正常工作
  1).基于URL PATH PARAMETER,默认支持
  2).基于cookie(大多数)
  3).基于SSL,默认不支持,只有connnector.getAttribute("SSLenabled")为true时才支持
  web.xml中配置session-config配置项,其cookie-config下的name属性就是SessionCookieName的值,如果没有配置session-config,默认的是SessionCookieName就是“JSESSIONID”。同一个客户端每次和服务端交互时,不需要每次都传回所有的Cookie值,只需要传回一个id,这个id就是客户端第一次访问服务器时生成的,而且每个客户端是唯一的。这样每个客户端就有一个唯一的id,这个id就是sessionid.
需要说明的是,与session关联的cookie与其他cookie没有什么不同。
2.session是如何工作的
  有了sessionid,服务器就可以创建HttpSession对象了,第一次出发通过request.getSession()方法。如果当前的session id还没有对应的httpSession对象,那么就创建一个新的,并将这个对象加到org.apache.catalina.manager的session容器中保存。Manager类将管理所有的Session的生命周期,Session过期将被回收,服务器关闭,Session将被序列化到磁盘等。只要这个HttpSession对象存在,用户就可以根据SessionId来获取这个对象,也就做到了对状态的保持。
说明一点:为什么关闭浏览器session就会“失效”:比如登录的时候,关闭浏览器,再重新打开,还得重新登录,这是为什么呢?session不是保存在服务器端么
  原因:是因为sessionid的唯一,当浏览器访问的时候,cookie会保存一个sessinoid,这样就可以通过sesssionid获取session,关闭浏览器实际上session还在,但是sessionid不在了,变了,所以看上去session失效了,其实session还在服务器端保存着,只是没有sessionId,所以也取不到session的值。

3.StandarManager如何管理session(实现类StandardSession)

  StandardManager类负责Servlet容器(servlet容器也就是tomcat)中所有的StandardSession对象的生命周期管理。当Servlet容器重启或者关闭时,StandardManager负责持久化没有过期的StandardSession对象,它会将所有的StandardSession对象持久化到“SESSIONS.ser”为文件名的文件中。当Servlet容器重启时,也就是StandardManager初始化时,它会重新读取这个文件,解析所有的Session对象,重新保存在StandardManager的Sessions集合中。
  当servlet容器关闭时StandardManager类会调用unload方法将sessions集合中的StandardSession对象写到“SESSION.ser”文件中,然后在启动时再按照上面的状态图重新恢复。注意:要持久化保存session对象,必须调用servlet容器中的stop和start命令,而不能直接kill容器的进程。直接kill进程,容器都没有机会调用unload方法。
三.分布式session框架
1.思路
  需要一个订阅服务器,在应用启动时可以从这个订阅服务器订阅这个应用需要的可写session项和可写cookie项,这些配置的session和cookie可以限制这个应用能够使用哪些session和cookie,甚至可以控制session和cookie可读或者可写。这样可以有效控制session的安全性和cookie的数量。









 

posted @ 2016-12-07 20:57  刘尊礼  阅读(194)  评论(0)    收藏  举报