Cookie和Session

版权声明:转载请说明去处,文章仅供学习参考 https://blog.csdn.net/qq_38487155/article/details/82494512
一、Cookie

Cookie:是客户端在发送请求时服务器缓存在浏览器的数据,一般和request域配合转发使用,转发使用相同request能够将

Cookie在不同页面上保存获取

1、Servlet(JSP里<%%>)中发送Cookie给客户端

1
2
  Cookie cookie = new Cookie("data", "abcdefg");
 response.addCookie(cookie);

2、 Servlet(JSP里<%%>)中接收客户端发来的Cookie

1
2
3
4
5
6
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

1
2
3
4
5
6
7
 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

1
2
3
4
5
6
7
8
 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:
1
HttpSession session = request.getSession();

2、Session域拥有方法:

setAttribute(String name,Object Key):使用键值对方式存入数据对象

getAttribute(String name):通过键名取出数据对象

removeAttribute(String name):通过键名删除已存入的数据对象

3、Session其它常用方法:

1
2
3
<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保存到客户端。这也是一个新的会话开始了。