Cookie和Session总结

会话

打开浏览器,输入服务器的URL地址,在浏览器中多次访问服务器的资源,最后关闭浏览器的整个过程,我们叫会话

保持会话数据的技术
1.Cookie(客户端技术)
2.HttpSession(服务端技术)

会话过程要解决的问题是:保持各个客户端自己的数据.

1.概念
Cookie是用来保存服务器向每个客户端响应的数据,它存在于客户端

2.作用
Cookie能够让服务器知道该客户端之前有哪些私有数据

3.Cookie常见API

name:名称不能唯一确定一个Cookie。路径可能不同。
value:不能存中文。
path:默认值是写Cookie的那个程序的访问路径
比如:http://localhost:8080/day10_00_cookie/servlet/ck1写的Cookie
path就是:/day10_00_cookie/servlet 看当前创建cookie的资源(servlet)文件路径
客户端在访问服务器另外资源时,根据访问的路径来决定是否带着Cookie到服务器
当前访问的路径如果是以cookie的path开头的路径,浏览器就带。否则不带。

maxAge:cookie的缓存时间。默认是-1(默认存在浏览器的内存中)。单位是秒。
负数:cookie的数据存在浏览器缓存中
0:删除。路径要保持一致,否则可能删错人。
正数:缓存(持久化到磁盘上)的时间

从服务器向客户端存入Cookie

    //创建Cookie
    Cookie cookie = new Cookie("NAME","HTML");

    //创建该Cookie属于哪些应用的
    coolie.setPath("/day12");

    //设置Coolie在客户端存活的时间,单位秒,过期后,服务器就不能读取该Cookie
    cookie.setMaxAge(1*24*60*60);

    //通过响应对象将Cookie写入浏览器
    response.addCookie(cookie);

从客户端获取Cookie

//获取所有有效期的所有Cookie
Cookie[] cookies = request.getCookies();

//判断
if(cookies!=null && cookies.length>0){
    Cookie  nameCookie = null;
    for(Cookies cookie ){}
}else{
    response.getWriter().writer("no cookie");
}
Cookie特点

1.一个Cookie只能标识一种信息,而且Cookie的值只能是String类型,不能存中文.
2.一个Web网站可以给一个Web浏览器发送多个Cookie,一个Web浏览器也可以存储多个Web网站的Cookie
3.浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
4.如果创建了一个Cookie,并将他发送到浏览器,默认情况下它是一个会话级别的Cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该Cookie存储在磁盘上,则需要使用setMaxAge()),并给出一个以秒为单位的时间。将最大时效设为0,则该Cookie无效,无效的Cookie,服务器是读取不到的。
5.浏览器可以禁用Cookie,但不建议这样做
6.Cookie创建于服务器,保存于客户端
7.服务器只能都取本Web网站的Cookie,且只能读取时间有效的Cookie,不能都取无效时间的Cookie
8.服务器只能读取相同客户端的Cookie,即如果客户端用IE访问的话,那么服务端只能读取IE浏览器
中的所有Cookie,此时是不能读取Google浏览器中的Cookie的,反之相同

HttpSession

什么是Session:
一个浏览器独占一个session对象,session由服务器创建。cookie客户端技术,只能存字符串。HttpSession服务器端的技术,它可以存对象。
HttpSession是用来保存服务器向每个客户端响应的私有数据,它存在于服务器端。
Cookie是用来保存服务器向每个客户端响应的私有数据,它存在于客户端。
本质上HttpSession是基于Cookie技术的,只是该Cookie不会存于浏览器缓存中。

HttpSession域对象

HttpSession域对象:在同一个浏览器中的多次会话间能共享的一个域对象

常用方法:
创建HttpSession域对象:

//创建Session对象或获取Session对象
HttpSession session = request.getSession();

HttpSession request.getSession()的内部执行原理:
1、获取名称为JSESSIONID的cookie的值。
2、没有这样的cookie,创建一个新的HttpSession对象,分配一个唯一的SessionID,并且向客户端写了一个名字为JSESSIONID=sessionID的cookie
3、有这样的Cookie,获取cookie的值(即HttpSession对象的值),从服务器的内存中根据ID找那个HttpSession对象:
找到了:取出继续为你服务。
找不到:从2开始。

HttpSession request.getSession(boolean create):
参数:
true:和getSession()功能一样。
false:根据客户端JSESSIONID的cookie的值,找对应的HttpSession对象,找不到返回null(不会创建新的,只是查询)。

操作域对象属性:
setAttribute(String,Object)
getAttribute(String)
removeAttribute(String)
session.getId();

销毁HttpSession域对象:
//安全退出HttpSession
session.invalidate();

配置HttpSession的有效时间,单位:分
HttpSession域对象默认的30分钟有效期结束
设置最大存活时间:
setMaxInactiveInterval(int interval)
web.xml文件配置:

1

URL重写

URL重写:将数据跟在URL后面,传递给客户端,不存入客户端,下次发送请求时,数据依然跟在URL后面带到服务器

为什么要URL重写:
如果客户端禁用Cookie了,服务器的数据无法以Cookie形式保存在客户端,这样下次访问服务器时,服务器就无法得知上次客户端的私有数据了。为了解决这个问题,只能将数据跟在URL后面,每次请求和响应都带着这些客户端私有数据,这样服务器就可以知道上次客户端的私有数据了,URL后面跟着HttpSession的ID号。

方法:
重定向:
url = response.encodeRedirectURL(url);
response.sendRedirect(url);
非重定向,即转发,超链接:
url = response.encodeURL(url);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值