Javaweb(五)Session/Cookie篇
前言
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。
常用的会话跟踪技术是Cookie与Session。
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
本篇主要讲述Session和Cookie机制,以及如何使用
如果还有新手村玩家(比如我 )没有看前两张基础篇或不知道Servlet/Jsp基础的,建议先去学一下基础知识哦
Javaweb(一)网络基础篇
Javaweb(二)框架搭建篇
Javaweb(三)Servlet/Jsp原理篇
Javaweb(四)Servlet/Jsp实战篇
一、会话
- 会话:用户打开一个浏览器,点击了多个链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;
- 有状态会话:一个浏览器访问过服务器,下次访问的时候服务器就会认识这个浏览器
- cookie:服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了
- session:服务器登记你来过了,下次你来的时候我来匹配你
- 众所周知http协议是无状态协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
二、Cookie
1.Cookie是什么
Cookie实际上是一小段的文本信息,是一种记录客户状态的机制。
2.工作原理
客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态
3.特性
- Cookie具有不可跨域名性:根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。
- 不提供修改、删除操作:如果需要修改,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。如果需要删除,只需要将maxAge设置为0
4.内置函数
public class Cookie implements Cloneable, Serializable {
//Domain 可以访问该Cookie的域名
public void setDomain(String domain) {
this.domain = domain.toLowerCase(Locale.ENGLISH);
}
public String getDomain() {
return this.domain;
}
//MaxAge 该Cookie失效的时间,单位秒 正数为时间 负数为临时 0为删除
public void setMaxAge(int expiry) {
this.maxAge = expiry;
}
public int getMaxAge() {
return this.maxAge;
}
//每个name唯一对应一个cookie
public String getName() {
return this.name;
}
//Value cookie值
public void setValue(String newValue) {
this.value = newValue;
}
public String getValue() {
return this.value;
}
}
三、Session
1.Session是什么
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上
2.工作原理
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
3.特性
- 当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见
- Session在用户第一次访问服务器的时候自动创建
- Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session
- 为了获得更高的存取速度,服务器一般把Session放在内存里
- 为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除
4.内置函数
public interface HttpSession {
//还是那个东西
ServletContext getServletContext();
//每个id对应唯一的Session
String getId();
//创建时间,最后活跃时间,超时时间
long getCreationTime();
long getLastAccessedTime();
void setMaxInactiveInterval(int var1);
int getMaxInactiveInterval();
//属性处理
Object getAttribute(String var1);
Enumeration<String> getAttributeNames();
void setAttribute(String var1, Object var2);
void removeAttribute(String var1);
//使Session失效(也可以在web.xml里设置失效时间)
void invalidate();
//判断Session是否是新的
boolean isNew();
}
四、区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上.
- cookie比较不安全(但是可以加密)
- 单个cookie保存的数据不能超过4K,而且有数量限制。session没有限制,还可以储存复杂的数据类型
- session会在一定时间内保存在服务器上。当访问增多,服务器性能会降低。