Cookie和Session
一、Cookie
Cookie:是客户端在发送请求时服务器缓存在浏览器的数据,一般和request域配合转发使用,转发使用相同request能够将
Cookie在不同页面上保存获取
1、Servlet(JSP里<%%>)中发送Cookie给客户端
Cookie cookie = new Cookie("data", "abcdefg");
response.addCookie(cookie);
2、 Servlet(JSP里<%%>)中接收客户端发来的Cookie
Cookie[] cookie = request.getCookies();
if(cookie != null) {
for(Cookie c : cookie) {
System.out.println(c.getName() + "=" + c.getValue());
}
}
3、Cookie的生命周期:全都由setMaxAge()方法决定,默认为退出浏览器(会话结束)Cookie消失
>0:保存在浏览器的时间,单位为秒
=0:删掉浏览器已存在的同名Cookie
<0:默认值,退出Cookie消失
4、Cookie的路径:由setPath()方法决定,当访问路径包含Cookie路径时缓存该Cookie
5、Cookie中保存中文:Cookie的name和value都是不能保存中文的,但可以先把中文转换成URL编码,然后在
保存到Cookie的name和value中,获取Cookie时,再使用URL解码即可。
******保存中文Cookie
String name = "姓名";
String value = "张三";
name = URLEncoder.encode(name, "utf-8");
value = URLEncoder.encode(value, "utf-8");
Cookie c = new Cookie(name, value);
response.addCookie(c);
******取出中文Cookie
Cookie[] cs = request.getCookies();
if(cs != null) {
for(Cookie c : cs) {
String name = URLDecoder.decode(c.getName(), "utf-8");
String value = URLDecoder.decode(c.getValue(), "utf-8");
System.out.println(name + "=" + value);
}
}
-------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------
二、HttpSession:Session是一个域对象,用来跟踪会话(即在打开浏览器至结束传输数据,JSP有内置对象Session,
可直接使用,与response,request同理)
***与request域对象、ServletContext域对象区别:在于生命周期不同。request是一次请求(可使用转发延长),
ServletContext是服务器关闭时,Session是浏览器关闭时。
***与Cookie不同:Cookie保存在浏览器端,Session保存在服务器端,相同点在于都是由request对象获得。
1. 获取HttpSession:
HttpSession session = request.getSession();
2、Session域拥有方法:
setAttribute(String name,Object Key):使用键值对方式存入数据对象
getAttribute(String name):通过键名取出数据对象
removeAttribute(String name):通过键名删除已存入的数据对象
3、Session其它常用方法:
String getId():获取sessionId,涉及Session原理
int getMaxInactiveInterval():获取Session最大不活动保存时间(单位为秒),默认为30分钟。
void invalidate():结束Session
boolean isNew():判断Session是否为第一次创建
4、设置session超时时间,在web.xml文件中配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5、Session的原理
Session是依赖Cookie实现的。
Session是服务器端对象
当用户第一次使用Session时(表示第一次请求服务器),服务器会创建Session,并创建一个Cookie,在Cookie中
保存了Session的id,发送给客户端。这样客户端就有了自己Session的id了。但这个Cookie只在浏览器内存中存在,
也就是说,在关闭浏览器窗口后,Cookie就会丢失,也就丢失了SessionId。当用户第二次访问服务器时,会在请求
中把保存了SessionId的Cookie发送给服务器,服务器通过SessionId查找Session对象,然后给使用。也就是说,只
要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个Session对象。这样也就可以让多个请求共享同一个Session了。
当用户关闭了浏览器窗口后,再打开浏览器访问服务器,这时请求中没有了SessionId,那么服务器会创建一个Session,再把SessionId通过Cookie保存到浏览器中,也是一个新的会话开始了。原来的session会因为长时间无法访问而失效。
当用户打开某个服务器页面长时间没动作时,这样Session会超时失效,当用户再有活动时,服务器通过用户提供的sessionId已经找不到Session对象了,那么服务器还是会创建一个新的sessionSession,再把新的SessionId保存到客户端。这也是一个新的会话开始了。