首页 > 代码库 > 会话跟踪
会话跟踪
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来分钟就销毁了。
会话跟踪