1.业务场景
- 登录时要记录账号
- 以后访问查询,增加,修改页面时要显示账号
2.前提条件
- 浏览器和服务器是多对一的关系
3,使用如下对象
###request : 登录,查询是不同的请求,使用不同的request
###config:
- 假设开发项目时采用多个servlet处理不同的请求
- 登录有一个servlet,查询有另一个servlet
- 多个servlet用不同的config
> 它没有读写变量的能力
###context:
- Tomcat内只有一个对象
- 每个人登录时传递的账号都是code="zhangsan"的数据格式
- 其中key都一样,存入context有冲突
4.正确的做法
- 使用cookie或session来保存这样的数据
5.它们的区别
- cookie存储在浏览器上,服务器压力小,但数据不安全
- session存储在服务器上,服务器压力大,但数据安全
6.如何选择
- 重要的数据存入session
- 一般的数据存入cookie
cookie
cookie的生存时间
- 默认的情况下,浏览器会将cookie保存在内存中,只要浏览器不关闭,cookie就一直存在。
- 如果希望关闭浏览器后cookie仍在,可以通过设置过期时间
void Cookie.setMaxAge(int seconds); 注:seconds单位是秒,精度不是很高
### seconds>0:浏览器要保存cookie的最长时间为设置的参数,如果超过指定的时间,浏览器会删除这个cookie。此时cookie保存在硬盘上。
### seconds = 0:删除cookie。在修改cookie的生存时间为0后,随着response发送回客户端,替换原有cookie,因声明周期到了即将该cookie删除。
### seconds < 0 : 缺省值,浏览器会将cookie保存到内存中。
1.演示
先模拟登陆功能,通过路径传入code参数
接着模拟主页功能,查看是否传递了cookie中的内容
配置好两个页面的xml文件路径
在main路径下创建的cookie,它只对/main及其以下目录有效
在浏览器中模拟数据的时候,输入http://localhost:8080/Jsp01/main/login?code=zhangsan
在本浏览器中可以获得cookie中的数据。
但是一旦换了一个浏览器,则无法获取,证明cookie是保存在浏览器上的。
2.特点
- cookie保存在浏览器上
- 多个请求可以共用一组cookie
- 多个servlet可以共用一组cookie
- 多个用户(浏览器)访问服务器,都会获得一组cookie
3.cookie编码
### cookie只能保存合法的ASCII字符。如果要保存中文,需要将中文转换成合法的ASCII字符,即编码。
4.cookie解码
### 编码后的cookie为了看到实际的中文,需要还原后再显示
5.cookie的路径问题
上面提到了:在main路径下创建的cookie,它只对/main及其以下目录有效
此处会重新定义c1的有效目录路径。但是之前的c1仍然是在/main/login目录下,所以会显示两个相同登录参数
6.cookie的限制
- cookie可以被用户禁止
- cookie会将状态保存在浏览器端,不安全。对于敏感数据,需要加密后再使用cookie来保存
- cookie只能保存少量的数据,大约4kb左右
- cookie的个数是有限制的
- cookie只能保存字符串
########################
session
1.演示
2.特点
- 浏览器第一次访问服务器时,服务器会给它创建1个session
- 服务器会使用cookie将SID返回给浏览器
- 浏览器再次访问服务器时会传入SID
- 多个请求可以共用一个session
- 多个servlet可以共用一个session
- 服务器会给每个浏览器创建一个session
状态: 用来证明浏览器曾经访问过的证据(数据)
浏览器禁用cookie的后果?
- 如果浏览器禁用cookie,session还能用吗?? 答案:不能,但有其他的解决方案!
- 服务器在默认情况下, 会使用cookie的方式将SessionId发送给浏览器,如果用户禁止Cookie,则SessionId不会被浏览器保存,此时,服务器可以使用如UTL重写这样的方式来发送SessionId!
什么是URL重写?
- 浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即:在原来的地址后面加上了SessionId)
如何实现URL重写?
- 如果是链接地址和表单提交,使用respinse.encodeURL(String url) 生成重写后的URL
- 如果是重定向,使用response.encodeRedirectURL(String url); 生成重写后的URL