j2ee中实现会话跟踪(值传递,cookie,session)

发布于 2020-04-14  122 次阅读


HTTP协议无状态带来的问题

无状态:没有记忆力,不知道哪一个客户端请求了自己,每个请求之间无法共享数据。这就无法知道会话什么时候开始,什么时候结束,也无法确定发出请求的用户身份。在一次会话中多次请求共享数据即会话跟踪技术。

参数传递机制-实现会话跟踪

将需要共享的数据以?Key=value&key2=value的方式传递给servlet(Get方式)。

Cookie-实现会话跟踪

把需要共享的数据以cookie的形式保存在客户端(浏览器)中,客户端发送请求时会将cookie一起发送过来。服务端读取cookie的内容就能获取共享的数据。

1. 增加

Cookie c = new Cookie(String name,String value);

2. 删除

// 不能直接删除,只能通过设置生存周期的方式使其失效后自动删除。
Cookie.setMaxAge(0);

3. 修改

方式1:根据name获取被修改的Cookie对象,在调用setValue方法即可。
方式2:重新创建一个同名的Cookie对象
注意:修改之后,需要重新增加进Response对象

4. 查询

5. 把Cookie响应给客户端

Response.addCookie(c);

6. Cookie的生命周期

缺省:会话
通过Cookie对象的setMaxAge(int seconds)可以设置生命周期。单位秒。

7. Cookie的路径和域范围

路径由Cookie.setPath("/")方法设置,缺省为Servlet资源名的相对路径。
域范围由Cookie.setDomain(".baidu.com");方法设置,在同一个一级域名下共享

8. Cookie的中文问题

Cookie的name和value是不支持中文的。解决方案:

9. Cookie的缺陷

序号 缺陷
1 中文处理麻烦
2 多人共用一台电脑时,信息不安全
3 一个Cookie只能存储一个简单类型的数据(String,String)

Cookie的大小和数量限制:
* Cookie大小限制在4KB之内
* 一台服务器在一个客户端最多只能存20个Cookie
* 一个浏览器最多可存300个Cookie

Cookie的原理
* 把共享数据存储在浏览器中,每次请求,再把共享数据带到服务端,最后把数据存放在服务端。

Session-实现会话跟踪

Session是一种服务端技术,把共享数据保存在服务端,解决会话跟踪。

服务端先分配一个Session的存储Id地址(jsessionid)给浏览器,浏览器每次请求的时候,都会带着jsessionid的值,再从该jsessionid的内存空间中去取出数据。

1. 增加

使用getSession()获取对象时,如果当前有对象,则返回对象。如果没有,则新建对象后返回。

getSession(true)与getSession()一样。getSession(false)这是没有则返回null

通过session对象的setAttribute(String name,Object value)方式可以设置数据。

2. 删除

通过session对象的removeAttribute(String name)方法可以删除一条共享数据。

3. 修改

重新设置一个同名的共享数据即可。

4. 查询

通过session的getAttribute(String name)方法来获取共享数据。

5. Session的拓展

1>属性习惯起名为:XXX_IN_SESSION
2>一般把登陆信息封装在一个对象中,再存储到session中
3>习惯把放入session的对象实现序列化,方便在网络上传输数据

6. session的超时管理

session.setMaxInactiveInterval(int seconds);

在上次操作指定秒数之后,自动销毁session

7. 销毁session对象(注销登陆/安全退出)

Session.invalidate(); // 方法销毁整个session对象。

8. 当Cookie被禁用时,URL重写问题

1>可以手动在资源名后面加上;jsessionid=xxxx
2>可以使用Response对象的encodeURL(String path)方法,可以使用cookie时,不会追加到URL中。当cookie被禁用时,会自动追加到URL后面。


做一只特立独行的猪