Cookie与Session的区别
- 为什么要使用Cookie和Session?HTTP协议是无状态链接。在一次回话(打开浏览器访问一个站点中的不同内容直到浏览器关闭称为一次回话)中,多次请求无法共享数据,无法跟踪用户的行为。
解决方案:
1.在URL地址栏拼接参数,但是不安全(`www.xxx.do?userId=1`)
2.使用Cookie
3.使用Session
Cookie
Cookie是客户端技术,所有的浏览器都支持Cookie缓存,Cookie数据存放的位置位于客户端的内存中,也可以调整Cookie存放与磁盘中。
步骤:
1.用户请求一个支持Cookie的后台服务器
2.服务器做请求处理,返回相应信息,并设置Cookie缓存用户信息。在可以在开发者模式相应头中看到Set-Cookie
看到Cookie中的数据,在后续的请求都会自动发送Cookie到服务器,直到Cookie销毁或过期。
3.客户端再次请求,在请求头中携带Cookie。
4.服务器接收到请求数据,并解析Cookie内容,做出请求相应。
Cookie分为回话Cookie和持久化Cookie。回话Cookie存放与客户端的内存中,浏览器关闭后Cookie自动销毁;持久化Cookie存放于磁盘中,浏览器关闭后不会销毁Cookie。可以通过cookie.setMaxAge(value);
来设置Cookie的存活时间。cookie.setMaxAge(0);
表示删除Cookie,cookie.setMaxAge(value<0);
表示回话Cookie;cookie.setMaxAge(value>0);
指定描述,可以用于设置持久化Cookie。
设置Cookie的作用域
Cookie中的字段中有两个可以设置Cookie的作用域。Path
设置Cookie的有效URL路径,Domain
指定Cookie的有效域。
cookie.setPath("/");
表示Cookie的作用域为整个应用,cookie.setPath("/**");
表示Cookie的作用域为**
的作用范围,路径为**
都能访问到Cookie,cookie.setPath("/view/a");
表示路径为view/a
的路径下都能访问Cookie,而view/b
不能访问到Cookie。
cookie.setDomain("value");
默认为web应用域名或者Ip地址。如果需要设置跨域访问:photo.google.com
和mail.google.com
实现cookie共享需要设置cookie.setDomain(".google.com");
Cookie的缺陷:
1.Cookie数据保留在请求投中,不安全。
2.Cookie数据存储中文需要转码,浏览器默认iso8859。
3.Cookie存放的数据为String类型
4.Cookie数据容量限制为4KB以内,一台服务器最多保留20个Cookie,一个客户端浏览器最多保存300个Cookie。
5.共享数据本应该放在服务器上。
Session
Session是服务端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个独享的Session对象,用于Session为用户浏览器独享,所以用户在访问服务器时,可以把各自的数据放在各自的Session中,当用户再去访问服务器其他web资源时,其他web资源再从服务端的Session中获取数据。
步骤:
1.用户请求一个支持Cookie的后台服务器
2.服务器做出请求处理,创建Session对象,保存用户的相关信息,并创建Cookie对象,Cookie对象的jsessionid
指向Session存放在服务器的内存地址。服务器通过相应头Set-Cookie
返回给浏览器Cookie的信息(Cookie中包含Session的内存地址,Session会消耗服务器的资源),在后续的请求都会自动发送Cookie到服务器,服务器通过解析Cookie中的jsessionid
来获取Session中的数据。
3.客户端再次请求,在请求头中携带Cookie。
4.服务器接收到请求数据,服务器通过解析Cookie中的jsessionid
在内存中来获取Session中的数据,做出请求相应。
Session超时管理
在浏览器与服务器的回话中,如果浏览器长时间没有与服务器进行交互,服务器的Session会自动销毁(网站登入后长时间没有交互后需要再次登入),浏览器与服务器之前的交互的Session就不存在了,如果需要再次用户Session的缓存,需要再次请求服务器重新创建新的Session。如果直接关闭浏览器,Session也会自动销毁,因为Session的应用地址时保存在Cookie中的,Cookie中数据是保存在浏览器的内存中的,浏览器关闭后Cookie销毁,无法识别Session的内存地址,超时后Session会自动销毁。
设置Session失效时间的三种方式:
1.在项目中的web.xml中设置,时间表示分钟
<session-config>
<session-timeout>2</session-timeout>
</session-config>
2.在tomcat的web.xml中设置,默认时30分钟
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3.在Servlet中设置
HttpSession session = request.getSession();
session.setMaxInactiveInterval(60);//单位为秒
-----------------
优先级是就近原则:Servlet>项目中的web.xml>Tomcat中的web.xml
URL重写
Session依托Cookie来记录Session在服务器的内存地址,但是浏览器可以设置禁用Cookie,这样浏览器请求数据的时候无法携带jsessionid
导致Session在服务器中失效。但是我们可以在地址栏手动拼接jsessionid
,如localhost:8080/demo;jessionid=***
,这样做很麻烦,Sun公司提供了两个方法用于在浏览器地址栏拼接jessionid
。
response.encodeUrl(url);
和response.encodeRedirectUrl(ulr);
。方法会先判断浏览器是否禁用了cookie,如果禁用了cookie会在url后拼接上jessionid
,如果浏览器没有禁用cookie,Session会通过请求头Cookie的jessionid
来传递。