HTTP 是一种"无状态"协议,客户端每次检索网页时,服务器会自动不保留之前客户端请求的任何记录。
Cookie:
Cookie 是存储在浏览器客户端计算机上的文本文件,保留了各种跟踪信息。
识别返回用户包括三个步骤:
- 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
- 浏览器将这些信息存储在本地计算机上,以备将来使用。
- 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。
Java Servlet中对Cookie是怎样支持的?
在Servlet规范当中,提供了一个类javax.servlet.http.Cookie. Cookie中的name和value都是String类型。
Cookie案例关键代码。
//在服务器端创建Cookie,发送给浏览器客户端
Cookie cookie=new Cookie("name","valiue");
cookie.setMaxAge(1000);//有效期设置,单位为秒
response.addCookie(cookie);
//浏览器发送Cookie给服务器后,服务器获取Cookie
Cookie[ ] cookies=request.getCookies();
if(cookie!=null){
for(Cookie cookie:cookies){
cookie.getName();
cookie.getValue();
}
}
session:
session对象主要是将会话状态保留在服务器端。而cookie是将会话状态保留在浏览器端。
维持 Web 客户端和 Web 服务器之间的 session 会话有三种方式:
-
Cookies
一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。
-
隐藏的表单字段
一个 Web 服务器可以发送一个隐藏的 HTML 表单字段,以及一个唯一的 session 会话 ID,如下所示:
该条目意味着,当表单被提交时,指定的名称和值会被自动包含在 GET 或 POST 数据中。每次当 Web 浏览器发送请求时,session_id 值可以用于保持不同的 Web 浏览器的跟踪。但该种会话跟踪方式在点击常规的超文本链接(
- URL 重写
在 URL 末尾追加额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。
例如,http://w3cschool.cc/file.htm;sessionid=12345,session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端。
URL 重写是一种更好的维持 session 会话的方式,它在浏览器不支持 cookie 时能够很好地工作,但是它的缺点是会动态生成每个 URL 来为页面分配一个 session 会话 ID,即使是在很简单的静态 HTML 页面中也会如此。
HttpSession接口中常用方法
getAttribute(String key);//从session获取数据
setAttribute(String name,String value); //向session存储数据
removeAttribute(String name)//移除指定数据
invalidate() //销毁session对象
cookie示意图:
session示意图:
cookie和session对比:
cookie | session | |
---|---|---|
存放位置 | 浏览器本地硬盘 | 服务器内存 |
值的类型 | 字符串 | 对象 |
存储大小 | 小,4k | 大,取决于服务器的设置 |
安全性 | 低 | 高 |