会话概念

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。简单的说就是,用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

Cookie

概念
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。由于cookie是由客户端浏览器保存和携带的,所以称之为客户端技术。
常用方法:

  • public Cookie(String name,String value)构造方法,传入cooke名称和cookie的值。
  • public int getMaxAge()返回该cookie的最长存活时间,以毫秒计。默认为-1,表明该cookie将persist(存留)直到浏览器关闭。
  • public String getName()取得Cookie的名字,名称不能唯一确定一个Cookie,因为路径可能不同。
  • public String getPath()返回浏览器返回该cookie到服务器的路径。cookie对于服务器上所有的子路径都是可见的。
  • public String getValue()取得Cookie的值。
  • public void setMaxAge(int expiry)设置Cookie的最大保存时间,即cookie的有效期,当服务器给浏览器回送一个cookie时。默认是-1(默认存在浏览器的内存中)单位是秒。负数:cookie的数据存在浏览器缓存中;0:删除。路径要保持一致,否则可能删错;正数:缓存(持久化到磁盘上)的时间。
  • public void setPath(String uri)设置浏览器返回该cookie的路径;默认值是写Cookie的那个程序的访问路径。不能存中文。
  • public void setValue(String newValue)设置Cookie的值。

注意:

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

Session

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

常用方法:

  • request.getSession()获取Session对象,如果不存在就直接创建。
  • request.getSession(boolean create)获取Session对象,如果不存在就返回false。
  • getId()获取SessionId。
  • getCreationTime()获取当前session对象的创建时间。
  • getLastAccessedTime()获取最后一次访问该session对象的时间。
  • setMaxInactiveInterval()设置Session最大时效
  • getMaxInactiveInterval() 获取Session最大时效
  • invalidate()销毁当前Session对象
  • setAttribute()设置session属性
  • getAttribute()获得session属性
  • removeAttribute()移除session属性
  • getAttributeNames()

session实现会话过程数据共享的原理
Session是基于Cookie的、服务器创建每个session的时候,会为每个session分配一个ID号,即 JSESSIONID,服务器会以cookie的方式把session 的id号写给浏览器、所以session是基于cookie的。当浏览器再次访问的时候,会带着session id号的cookie过来 ,这就是session实现共享的原理。服务器写这个cookie的时候,是没有写有效期的,所以当浏览器关闭的时候,cookie也就没了,session也就结束了,即会话过程。

客户端禁用Cookie后的会话数据保存问题
客户端禁用cookie:浏览器永远不会向服务器发送cookie的请求消息头
解决方案:
方案一:在主页上给出提示,提示用户cookie异常。
方案二:URL重写。必须对网站的所有地址都重写。不以cookie的方式把JSESSIONID带给服务器,而是把JSESSIONID以url的方式带到服务器,即:URL重写,URL重写解决了禁用cookie后,Session的共享问题。
response.encodeURL(String url);该方法可以识别浏览器有没有发送cookie请求消息头,没有就重写URL,有就不重写。
前提request.getSession()必须写。

Last modification:February 10, 2018
If you think my article is useful to you, please feel free to appreciate