什么是Cookie:
即解决用户的会话跟踪.
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Cookie的操作:
1:创建Cookie对象并设置共享数据[办一张会员卡,并填写卡上的信息. 【要导入相应的包才能创建,这个可以去百度查API找找】
Cookie c = new Cookie(String name,String value);
Cookie c = new Cookie("currentName","Will");
参数:
name: 给共享数据起个名字
value: 多个请求之前需要共享的数据
2:把Cookie放入响应中,响应给浏览器
response对象.addCookie(c);
3:从请求中获取Cookie对象,再从Cookie中获取共享的数据
Cookie[] cs = req.getCookies();
4:Cookie的属性名和属性值都不支持中文.
解决方案:URLEncoder对中文做编码操作. 编码(放进Cookie之前): 设置为utf-8
Cookie cookie = new Cookie("currentName",URLEncoder.encode(username, "UTF-8"));
解码(从Cookie中获取出来):
username = URLDecoder.decode(c.getValue(), "UTF-8");
5:修改Cookie(修改Cookie中存放的共享数据).
方式1:获取被修改的Cookie对象,cookie对象.setValue(新的数据)(不推荐);
方式2:创建一个和被修改Cookie同名的Cookie对象,只改变value值即可.
Cookie xxx = new Cookie("currentName","lucy");
注意:此时修改重新把修改之后的Cookie响应给浏览器.
6:Cookie的分类(根据Cookie存活的时间,分成两大类).
会话Cookie:在当前会话中有效,浏览器关闭就销毁了.此时该Cookie存放在浏览器进程中(缺省).
持久化Cookie:可以存活指定的时间(我们需要来设置Cookie的存活时间).
设置Cookie对象存储的最大时间.:
Cookie对象.setMaxAge(int seconds);
7:删除Cookie.
Cookie对象.setMaxAge(0):表示立刻删除该Cookie对象.
8:设置访问路径和域.
Cookie的path是在同一主机中指定共享Cookie,如果主机不同那么就一定不能共享Cookie,无论path是什么。
需求:AServlet和BServlet共享Cookie:
如果:AServlet的资源路径是/cookie/a,BServlet的资源路径是:/cookie/b. 此时共享成功.
如果:AServlet的资源路径是/cookie/a,BServlet的资源路径是:/ooxx/b. 此时不能共享.
默认情况下会根据Servlet的相对路径来做判断.
若需要让整个应用中所有的Servlet都可以获取该Cookie,则设置为:Cookie对象.setPath("/"); 如果希望不同的二级域名中可以共享Cookie,那么就要设置Cookie的domain了。 例如:music.baidu.com、map.baidu.com、tieba.baidu.com,它们的域名不同,但百度希望它们之间可以共享Cookie,那么就要设置domain了。
Cookie的缺陷:
1:Cookie存储中文的时候,操作麻烦(手动的编码/解码操作);
2:Cookie存储在浏览器中,多个人使用共同的一台的电脑的时候,不安全.
3:Cookie的文件大小和数量是有限制的.
Cookie大小限制在4KB之内;
一台服务器在一个客户端最多保存20个Cookie;
一个浏览器最多可以保存300个Cookie;
4:Cookie的value只能存储String类型的数据,一个Cookie只能存储一个共享数据.
若需要共享多个数据,就得创建多个Cookie对象,操作起来比较麻烦
如果Cookie的Value可以存储Object类型,我们就可以把多个数据封装成对象,再做存储.
5:Cookie在设计上的问题.
Cookie的设计:把客户端和服务端的识别数据存放于客户端中,这个在设计上有点不合理.
最好的设计方式:把识别数据存放于服务端,客户端只需要存储一个标志即可.
什么是Session:
Session是服务器端技术(把识别数据/共享数据存放于服务端),利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
Session其实就是一个特殊的会话Cookie,浏览器关闭Session就销毁了
操作Session:
1:创建和获取Session对象.
HttpSession session = request对象.getSession(true);
如果当前存在Session对象,则直接返回,如果当前没有Session对象,先创建一个Session对象,再返回.
HttpSession session = request对象.getSession(false);
如果当前存在Session对象,则直接返回,如果没有,在则返回null.
HttpSession session = request对象.getSession();
等价于 request对象.getSession(true).
2:往Session中存储共享数据.
session对象.setAttribute(String name,Object value);
一般情况下,存储在session中的属性起名为:XXX_IN_SESSION.
1:因为Session的setAttribute方法支持Object类型,所以我们可以把多个共享数据封装成对象,再存储到session中.
session.setAttribute("USER_IN_SESSION",user对象);
2:一般的,为了多态服务器之间共享session中的数据,我们把session中的对象实现java.io.Serializable接口.
当某一个对象只有实现java.io.Serializable接口之后,才可以做序列化操作.
序列化: 把对象的数据以二进制的形式存储到文件中.-相当于网络传输.
反序列化: 把二进制形式的数据恢复成Java对象.
3:获取Session中存储的数据.
Object value = session对象.getAttribute(String name);
4:删除Session(删除Session中存储的共享数据)[登录注销]:
方式1:session对象.remove(String name);从当前session中删除指定属性名的属性.
方式2:session.invalidate();销毁session对象,从而session中的数据全部没了.
5:Session的超时管理.
超时时间:用户的两次操作的最大间隔时间:超时时间到了,就会销毁Session.
session对象.setMaxInactiveInterval(int seconds):
一般说来:不用设置,Tomcat中默认为30分钟.
6:URL重写.
Session其实也就是一个会话Cookie(浏览器关闭之后,浏览器存储的jsessionid消失了,session对象在服务端依然存在).
浏览器可以禁用Cookie(不接受Cookie),不推荐使用,操作相当麻烦.
解决方案:手动的在每一个资源后面携带:;jsessionid= session的id值. http://localhost/session/get
因为浏览器没有存储session的id值,所以找不到服务端的共享数据内存地址. http://localhost/session/get;jsessionid=FACF8BD9AFB39C1A85A1B1FDC1978923 .
URL重写:
String newUrl = response对象.encodeURL(String oldUrl);
String newUrl = response对象.encodeURL("session/get");
返回:/session/get;jsessionid=FACF8BD9AFB39C1A85A1B1FDC1978923
解决用户的会话跟踪问题(实现多个请求之间共享数据):
Cookie: 客户端技术:把共享数据存储在浏览器中. Session:服务端技术:把共享数据存储在服务端,只是给了客户端一个地址(jesseionid).