web开发:cookie是什么?原理是什么?怎么使用?用在什么地方?

存储客户端的状态

京东商城在没有登陆的情况下依然可以将商品加入购物车,那么这个购物车的数据存储到哪里呢?肯定不是request,因为如果是它的话,每加入一件,再去访问其它商品,在加入一件,上一次商品就没有了,因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,在未登录的情况下,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态

会话技术Cookie和Session

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。

Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookieSession:将数据存储到服务器端,安全性相对好,增加服务器的压力

Cookie技术详解

创建Cookie

Cookie cookie = new Cookie(String cookieName,String cookieValue);

参数为cookie的名称和cookie的值,举例:Cookie cookie = new Cookie("username","zhangsan");

那么创建了一个cookie,并且向cookie中写入了数据username=zhangsan,注意cookie中不能写入中文,也就是说后面的验证码效验,如果是中文验证码,则不能用cookie

如果我们将这个cookie向客户端发送,那么相应头的形式是这样的

设置Cookie在客户端的持久化时间

cookie.setMaxAge(int seconds);seconds为秒

cookie默认的生命周期是一个会话,就是说只要浏览器关系,他就没有了,如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里,设置多久时间,他就会存在多长时间

举例:

设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器自动删除该cookie信息cookie.setMaxAge(10*60);

设置Cookie的携带路径

如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息,比如/aa/servlet的这个路径的servlet产生了cookie,那么只有在访问WWW/aa下的资源的时候才会带cookie,如果访问WWW/a.jsp则不会带cookie,因为他不是aa目录下的

示例:

cookie.setPath("/WEB16");代表访问WEB16应用中的任何资源都携带cookiecookie.setPath("/WEB16/cookieServlet");代表访问WEB16中的cookieServlet时才携带cookie信息cookie.setPath("/");访问服务器下的所有应用都携带这个cookie

向客户端发送cookie:

response.addCookie(Cookie cookie);创建完成之后,只有发送才能到答响应体

删除客户端的cookie:

如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可

new相同name值的cookie,值无所谓(new相同的name的cookie会把前面相同name的覆盖)设置相同的setpath,最好设置最大Age为0,才删除,必须全部一样然后response.Add(这个cookie)向响应头增加一个set-cookie字段

第一次浏览器访问网站因为没有cookie,所以请求行没有cookie,假如他访问的servlet,new了一个cookie,并且response。add这个cookie,那么下次浏览器在访问这个网站资源(如果setpath合适的话),他会在请求头中带上这个cookie

那么我们此时可以通过request获取这个cookie,并且解析里面的值

1)通过request获得所有的Cookie:(只能获取所有)Cookie[] cookies = request.getCookies();2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookiefor(Cookie cookie : cookies)}

一个cookie创建的时候只能添加一个键值对,一个web站点可以给web浏览器发送多个cookie,一个浏览器也可以存储多个cookie,一般允许存放300个cookie,每个网站允许存放20个

Session技术

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间(session)这个它自动操作,不用我们关心。这个JSESSIONID是在cookie中存储,所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID,JSESSIONID被清了之后(cookie被删),即使session还存在,但是因为cookie存储的JSESSIONID不在了,也找不到这个Session了

cookie创建,之后,需要手动的response.addCookie,而session不用,只要创建之后,服务器会自动的将其放到了服务器端了。

1.获得Session对象

HttpSession session = request.getSession();

此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回,这个方法实质就是它会先获取cookie中的JSESSIONID,如果没有获取到则直接创建session,如果获取到JSESSIONID,则去找对应的session,如果有则获取session对象,如果没有则创建。

HttpSession session = request.getSession(false);//有就获取,没有不创建

如果cookie被清的话,虽然session还存在,但是当我们request.getSession();的时候因为JSESSIONID没有了,所以还是会创建一个新的session,并产生一个新的JSESSIONID

当我们有session对象的时候可以通过session.Getid()的方式来获取JSESSIONID

向session中存取数据(session也是一个域对象)

session.setAttribute(String name,Object obj);session.getAttribute(String name);session.removeAttribute(String name);

Session对象的生命周期

创建:第一次执行request.getSession()时创建

销毁:服务器(非正常)关闭时或session过期/失效(默认30分钟)

30分钟是从什么时候开始算呢?从不操作服务器端的资源开始计时,访问一个网页,然后就不点击了,就开始计时,如果29分钟不动,之后再访问网站的其它资源,又开始重新计时,从0开始

默认30分钟可以在工程的web.xml中进行配置30

注意浏览器关闭是cookie默认销毁,但是session还会存在,但是cookie销毁session就没有什么意义了,因为找session要靠cookie

3)手动销毁session

session.invalidate();

我们要树立一个观念cookie和session都是和浏览器相关的,和用户是否登陆无关

session对象由服务器创建,开发人员可以调用request对象的getsession方法获取session对象,因为session默认有效期为一个会话(虽然它30分钟消亡,但是它的有效期还是一个会话,原因是cookie默认有效期一个会话,cookie死亡,session也没意义了)

那么如何才能让session所对应的那个cookie存活时间长点呢?不至于关掉浏览器就灭亡,它存活时间长,session才能更有意义。

首先我们要获取或创建session,然后获取这个session的JSESSIONID,然后创建cookie(要完全按照session所对应的cookie的键,这样才会覆盖),还要设置相同路径,session的cookie的默认路径为/应用名称,之后设置好时间,这样就ok了

session是为会话服务,也就是说所有浏览器访问的web应用都有机会可以获取到session,但是因为想要获取session前提是cookie,而cookie默认在哪个应用创建cookie,访问这个网站时浏览器才会带上这些cookie,所以自己的应用只能得到自己的cookie,访问自己的session。

如果浏览器把cookie给禁止了怎么办?

使用cookie的目的时让其带着sessionid去访问服务器资源,来确定是否有session可以用,若cookie被禁止的话,就只能在超链接后面加上session号了,这样访问超链接时,也相当于带着session号去访问资源,一次来确定是否有session可以用


“我自己是一名从事了5年前端的老程序员,辞职目前在做讲师,今年年初我花了一个月整理了一份最适合2018年学习的web前端干货,从最基础的HTML+CSS+JS到移动端HTML5到各种框架都有整理,送给每一位前端小伙伴,这里是小白聚集地,欢迎初学和进阶中的小伙伴。"

web前端资料学习群:618522268

为了感谢大家的支持,今天我在这里统一说下吧,关注公众号:‘web前端EDU',就可以领取上全套视频学习资料!

如果你有什么好的看法或者观点可以在评论区展现你的才华,互动交流。

这样购买链接后面带有session号,点击链接访问servlet1,它内部获取session的话,它自动会按照session号来找,和cookie一样,只不过以前cookie的是自动,而这个是手动设置,当两种方式都存在时,以cookie为主

同时打开多个浏览器在,只得是一个浏览器打开多个页面,比如新加选项卡,这些都是属于一个会话的

猜你喜欢

转载自blog.csdn.net/zwjweb/article/details/80606852