servlet-6(session和cookie)

Cookie

  1.用户登录后将浏览器关闭,下次登录不需要输入密码如何实现的呢?

       如果你换台机子登录会发现无法自动登录,由此我们知道这些信息是保存在客户端的电脑里的,并没有保存在服务器端。

  Cookie是一种会话状态爱跟踪的技术,然而Http协议是无状态协议。Cookie是由服务器生成保存在客户端的一种信息载体,这个载体中存放着用户访问该站点的会话信息状态。只要Cookie没有被清空,或者没有失效,那么保存在其中的会话状就有效。

  用户在第一次提交请求后,由服务器生成cookie,并将其封装在响应头里,以响应的形式发送给客户端。客户端接收到这个响应后,将其保存在本地。当客户端再次发送同类请求时,请求中会携带保存在客户端的cookie数据,发送到服务端,由服务器对会话进行跟踪。cookie是由若干键值对构成的。

  2.javaee中的cookie

  java.servlet.http中有一个类Cookie,其中有一个带参的构造器public Cookie(String name,String value),而在HTTPServletResponse中有一个方法,可以将cookie添加到响应中去

    Cookie cookie1 = new Cookie(name,value);

    response.addCookie(cookie1);

  (1)改变cookie的绑定路径  : 

    Cookie cookie2 = new Cookie(name,value);

    cookie2.setPath( );

  (2)改变的cookie在本地的存放位置

    默认情况下cookie是保存在本地的浏览器缓存中的,浏览器关闭,缓存消失,Cookie也消失,通过设置cookie的有效时长可以将cookie保存到本地硬盘文件中去。

    cookie类中有一个方法可以设置有效时长,public void setMaxAge(int expiry)

    根据设置参数expiry的数字,单位为秒。若其值大于0,则表示要将Cookie写入到硬盘文件中去,小于0放在 浏览器缓存中,与默认等效,等于0时,则表示cookie产生后直接失效。

  (3)服务端读取请求的cookie

          HttpServletReqest中有个getCookies()方法可以获取到cookie

 

Session

    cookie是将会话状态保存在了客户端,而session是将会话状态保存在服务端。当用户打开浏览器发出第一次请求开始到用户关闭浏览器就是一次会话完成。

getSession(true)判断有没有session,如果没有的话则创建一个新的session,若为false的则不创建 。

 

原理

    服务器对当前应用中的Session 是以Map 的形式进行管理的,这个Map 称为Session 列
  表。该Map 的key 为一个32 位长度的随机串,这个随机串称为JSessionID,value 则为Session
  对象的引用。
    当用户第一次提交请求时,服务端Servlet 中执行到request.getSession()方法后,会自动
  生成一个Map.Entry 对象,key 为一个根据某种算法新生成的JSessionID,value 则为新创建
  的HttpSession 对象。
    服务器生成并发送Cookie
    在将Session 信息写入Session 列表后,系统还会自动将“JSESSIONID”作为name,这
  个32 位长度的随机串作为value,以Cookie 的形式存放到响应报头中,并随着响应,将该
  Cookie 发送到客户端。
    客户端接收并发送Cookie
    客户端接收到这个Cookie 后会将其存放到浏览器的缓存中。即,只要客户端浏览器不
  关闭,浏览器缓存中的Cookie 就不会消失。
  当用户提交第二次请求时,会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送

session的失效

    Web 开发中引入的Session 超时的概念,Session 的失效就是指Session 的超时。若某个
  Session 在指定的时间范围内一直未被访问,那么Session 将超时,即将失效。
  在web.xml 中可以通过<session-config/>标签设置Session 的超时时间,单位为分钟。默
  认Session 的超时时间为30 分钟。需要再次强调的是,这个时间并不是从Session 被创建开
  始计时的生命周期时长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的
  时长。
    若未到超时时限,也可通过代码提前使Session 失效。HttpSession 中的方法Invalide(),  
  使得Session 失效。
  public void invalidate()

 

posted @ 2017-11-23 12:52  昵称什么的都不重要  阅读(253)  评论(0)    收藏  举报