首页 > 代码库 > 会话跟踪

会话跟踪

Servlet-日常笔记


什么是会话和会话跟踪?

  会话:可以简单理解为一个用户,打开了一个浏览器,访问某一个站点,访问web资源,然后关闭浏览器,这个过程就是一个会话。

  会话跟踪:HTTP是无状态协议,也就是没有记忆力,这就产生了问题,每个请求之间无法共享数据,在一个会话中,共享数据即会话跟踪。

 

会话跟踪方法:

  1)使用参数在请求中传递:在资源名称后面添加参数。

  格式:路径?参数名=参数值。

  然后在需要使用该数据的地方通过request的getParameter()方法获取该参数值。

  2)使用Cookie

  Cookie:把需要共享的数据,保留在客户端(浏览器)中。

  步骤:

  /*创建Cookie*/
      Cookie c = new Cookie("currentname","test");
  /*添加Cookie到响应中,传递给浏览器保存*/
      response对象.addCookie(c);
  /*在请求中获取Cookie和数据*/
      Cookie[] cs = request对象.getCookies();
  /*修改Cookie指定名的value值*/
    方法一:获取Cookie对象后使用setValue()方法更改。
    方法二:重新创建一个同名的Cookie,覆盖原有的Cookie。    

  注意:修改之后,要调用response对象的addCookie()方法。

  /*Cookie的生命周期*/

    缺省情况:关闭浏览器后Cookie丢失。

    可通过setMaxAge(int seconds)方法来设置,可设置值为正数、负数和0.

    seconds>0:表示Cookie存活的时间。

    seconds<0:表示存放在浏览器进程中,缺省情况。

    seconds=0:表示删除Cookie。

  /*Cookie的路径和域范围*/

    Cookie对象.setPath(String path);

    若不设置,则使用存放CookieServlet资源名的相对路径。

    Servlet跳转时若路径不同,则无法获取Cookies。

    设置在整个应用中在请求的时候都鞋带Cookie的方法:

    Cookie对象.setPath("/");

    

    在不同应用/主机之间如何共享Cookie?

    通过设置域解决。

    先了解一下二级域名,二级域名需要配置好虚拟主机,常见的有百度的二级域名,如music.baidu.com、tiebai.baidu.com,这些二级域名之间都会共享登陆信息。

    设置域的方法:

    Cookie对象.setPath("/");

    Cookie对象.setDomain(".baidu.com");

 

  3)HttpSession类

  javax.servlet.http.HttpSession HttpSession技术实际上还是利用Cookie技术 

  session是一种服务端技术,把共享数据保存在服务端。(Cookie是保存在客户端)

  每一个HttpSession对象,都有唯一的一个ID,是一个特殊的Cookie:

  • 这个Cookie的name是"JSESSIONID"。
  • 这个Cookie的value是该对象的id,一长串类似于地址的字符。

  方法:

    1.获取Session对象/创建Session对象。

    HttpSession s = request对象.getSession();  等同于getSession(true).

    HttpSession s = request对象.getSession(true); 如果当前有Session对象,直接返回,否则创建一个。

    HttpSession s = request对象.getSession(false); 如果当前有Session对象,直接返回,否则返回null。

    2.存储数据到Session中

    Session对象.setAttribute(String name, Object value);

    3.从Session中获取数据

    Object val = session对象.getAttribute(String name);

    4.修改session中的数据

    重新设置一个同名的属性名。

    5. 删除Session

    删除指定名称的数据:Session对象.removeAttribute(String name);

    删除整个Session对象:Session对象.invalidate(); 常用于注销登录

    6.Session拓展

    封装多个信息作为对象存储到Session中。

    一般我们习惯把Session对象让他实现序列化接口(java.io.Serializable),原因是当多态服务集群的时候,彼此之间可以共享Session数据。

    序列化:把对象转换为二进制数据。

    反序列化:把二进制数据恢复成对象。

    该接口没有方法。

    7.Session超时管理

    Session对象.setMaxInactiveInterval(int seconds);

    表示上一次操作之后,指定时间内无交互,则Session会被自动销毁。(保证安全,释放内存)

    

  1.参数传递的方法会暴露敏感信息,不可行。

  2.Cookie也面临许多问题:一个Cookie只能存储一个简单类型的数据,value只能存String类型,当对象有多个属性时则不可行;Cookie的大小限制在4KB之内浏览器保存Cookie的个数也有限多人使用一台电脑,也会导致信息不安全。

  3.Tomcat中的Session默认超时时间为30分钟,一般20来分钟就销毁了。

会话跟踪