JavaWeb 之 必须掌握会话技术Cookie和Session, 你知道多少???(七)

广告位

3 目录 ​​​​​​​ 会话技术 会话技术: 相当于浏览器和服务器之间打电话的技术。 会话范围:(针对某个浏…

3

目录


​​​​​​​

会话技术

JavaWeb 之 必须掌握会话技术Cookie和Session, 你知道多少???(七)

会话技术: 相当于浏览器和服务器之间打电话的技术。

会话范围:(针对某个浏览器)

             会话开始:某个浏览器开启了

会话结束:该浏览器关闭了

会话中,有无限次请求,无限次请求间都可以进行数据传递。

会话技术:

Cookie:保存在浏览器的会话技术

Session:保存在服务器的会话技术

一.Cookie入门

Cookie就相当于浏览器和服务器之间传递的一张小纸条。

服务器负责写小纸条,负责查看小纸条

浏览器负责保存小纸条负责把小纸条展示给服务器看

作用:就是为了保存会话数据

入门Servlet:

/**  * cookie入门:向浏览器写一张小纸条:cookie  * @return  */ public String run1(){     //key:value 都是字符串     //1、写一个小纸条     Cookie c = new Cookie("k1", "v1");     //2、传递给浏览器,让浏览器保存     getResponse().addCookie(c);     return null; } 

JavaWeb 之 必须掌握会话技术Cookie和Session, 你知道多少???(七)

小结:

cookie的销毁是随着浏览器关闭而销毁的

创建cookie: new Cookie(名字”,”);

传递给浏览器:response对象.addCookie(cookie对象);

二.案例2:把浏览器发回来的cookie在服务器获取到

服务器把cookie传递给浏览器: 响应头  set-cookie

浏览器把cookie传递回服务器: 请求头   Cookie

1、获取浏览器发来的所有cookie:request对象.getCookies();//返回一个cookie数组,如果没有任何cookie,返回null

2、获取cookie名:cookie对象.getName();

     获取cookie值:cookie对象.getValue();

/**  * 获取浏览器发来的所有cookie,并展示控制台  * @return  */ public String run2(){     //1、获取浏览器发来的所有cookie     Cookie[] arr = getRequest().getCookies();     //2、遍历cookie数组,打印每一个cookie的名字和值     if(arr!=null){         for (Cookie cookie : arr) {             System.out.println("名字:"+cookie.getName()+"t 值:"+cookie.getValue());         }     }     return null; } 

三,Cookie原理

JavaWeb 之 必须掌握会话技术Cookie和Session, 你知道多少???(七)

通过请求和响应进行数据传递

四.Cookie使用注意

1、cookie是由http协议制定,只要使用http协议,就可以使用cookie。浏览器、手机端

2、cookie保存是有上限。(数量上限,容量上限)

一个浏览器保存的cookie也是有上限。300

一个网站只能在一个浏览器上最多保存30个。

Cookie的value值不能太多,4K.

localstorage 4G

例如:商品浏览记录、上次访问记录、7天内自动登录。

3、cookie不能直接保存中文

JavaWeb 之 必须掌握会话技术Cookie和Session, 你知道多少???(七)

不允许,报错。500

间接存中文

JavaWeb 之 必须掌握会话技术Cookie和Session, 你知道多少???(七)

JavaWeb 之 必须掌握会话技术Cookie和Session, 你知道多少???(七)

获取到值使用时,需要进行url解码。URLDecoder.decode

        建议:cookie中不要保存中文

五.Cookie种类(持久化)

持久化:把内存数据 保存到 硬盘文件中

Cookie分为两种:

  1. 保存在浏览器内存中的cookie(默认)。   特点是:浏览器关闭,cookie就会销毁
  2. 保存在浏览器对应的硬盘上(持久化cookie)。  特点:浏览器即使关闭,cookie也会保存下来(cookie的销毁与否和浏览器的关闭无关,和cookie自己的存活时间有关)

setMaxAge(int expiry)

设置cookie的存活时间。 秒

  • -1  默认。保存在浏览器的内存中

          浏览器必须打开着的,浏览器关闭cookie销毁

  • 0   让cookie立即销毁 (1970年1月1日就过期)
  • >0的正整数

              只要正整数大于0的,就会存活在浏览器对应的硬盘上,不以浏览器的关闭为销毁。

               而是时间到期,就会自动销毁

代码:

/**  * 设置持久化cookie  * @return  */ public String run3(){     //1、创建cookie     Cookie c3 = new Cookie("k3", "v3");     //设置存活时间     //c3.setMaxAge(-1);//默认     //c3.setMaxAge(60);//存活60秒     //c3.setMaxAge(60*60*24*7);//保存7天     c3.setMaxAge(0);//立刻过期,立刻删除cookie     //2、通过响应头传递给浏览器     getResponse().addCookie(c3);     return null; }

六.Cookie有效路径

访问的路径等于或者包含 某个cookie的有效路径,这个cookie就会被发给服务器

Cookie会保存在硬盘上,保存路径,是由浏览器来自动控制。

请求某个路径时,浏览器需要带哪些cookie,才要根据cookie的有效路径来判断

setPath(java.lang.String uri)

设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。

  • 例如:setPath(“/web/a/b”);

http://localhost:8080/web/a/b/oneServlet,可访问(当前路径)

http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径)

http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径)

  • 常见设置:setPath(“/”) ,当前tomcat下的所有的web项目都可以访问

代码:

/**  * 设置有效路径  * @return  */ public String run4(){     Cookie c4 = new Cookie("k4", "v4");     c4.setPath("/javaweb_day08_1"); //只要访问路径 等于或包含 /javaweb_day08_1,该cookie就可以被发给服务器     getResponse().addCookie(c4);      Cookie c5 = new Cookie("k5", "v5");     c5.setPath("/javaweb_day08_1/hehe");     getResponse().addCookie(c5);      Cookie c6= new Cookie("k6", "v6");     c6.setPath("/javaweb_day08_1/hehe/xixi");     getResponse().addCookie(c6);     return null; }

一般设置:setPath(“/项目名);

适用于:发请求时,判断带哪个cookie

七.Cookie唯一标识

唯一标识:cookie的身份证

唯一标识=域名+有效路径+cookie名字

如果两个cookie唯一标识相同,同一个cookie,浏览器会进行覆盖保存(新的覆盖旧的)

如果两个cookie唯一标识不同,不同的cookie,浏览器会进行追加保存(分别保存两个cookie)

两个cookie:以下两个cookie因为域名不同,不同cookie,追加保存

域名:  有效路径:/hehe  cookie名:k1

域名: 有效路径:/hehe  cookie名:k1

两个cookie:以下两个cookie因为有效路径不同,不同cookie,追加保存

域名:  有效路径:/hehe  cookie名:k1

域名:  有效路径:/xixi  cookie名:k1

两个cookie:以下两个cookie因为cookie名不同,不同cookie,追加保存

域名:  有效路径:/hehe  cookie名:k1

域名:  有效路径:/hehe  cookie名:k2

两个cookie:相同cookie,新的覆盖旧的

域名:  有效路径:/hehe  cookie名:k1

域名:  有效路径:/hehe  cookie名:k1

有一个保存7天的cookie需要删除,以下哪个代码正确:

以下代码在同一个Servlet中:
        Cookie c3 = new Cookie(“k3”, “v3”);
        c3.setMaxAge(60*60*24*7);//保存7天
        getResponse().addCookie(c3);

Cookie c4 = new Cookie(“k3”, “v3”);
        c4.setMaxAge(0); 
        getResponse().addCookie(c4);

因为同一个Servlet中,同一个tomcat中。

没有设置域名和有效路径,默认都是相同的。

Cookie名相同,所以唯一标识相同,相互覆盖

以下代码在同一个Servlet中:
        Cookie c3 = new Cookie(“k3”, “v3”);

c3.setPath(“/ddd”);
        c3.setMaxAge(60*60*24*7);//保存7天
        getResponse().addCookie(c3);

Cookie c4 = new Cookie(“k3”, “v444);

C4.setPath(“/ddd”);
    c4.setMaxAge(0); 
    getResponse().addCookie(c4);

唯一标识相同,相互覆盖。  和value无关

Session

一.简述&入门案例

保存在服务器的会话技术。

会话范围:针对的是某个浏览器(N次请求

Session是一个最常用的域对象。

  • Request:最小域对象。  针对某次请求
  • Session:针对某个浏览器(某个用户),会话范围
  • ServletContext:最大域对象。针对整个项目内部

入门案例:

获取session对象

/**  * 入门:获取session对象  * @return  */ public String run1(){     //方式一:     HttpSession s1 = getRequest().getSession();     //方式二:     HttpSession s2 = getSession();     //s1和s2在这里是同一个对象     return null; } 

二.常见API

方法声明 功能描述
String getId() 用于返回与当前HttpSession对象关联的会话标识号
long getCreationTime() 返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式
long getLastAccessedTime() 返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式
void  setMaxInactiveInterval(int interval) 用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔
boolean isNew() 判断当前HttpSession对象是否是新创建的
void invalidate() 用于强制使Session对象无效。

强制销毁对应session对象。

ServletContext getServletContext() 用于返回当前HttpSession对象所属于的WEB应用程序对象,即代表当前WEB应用程序的ServletContext对象

一般都是通过 this.getServletContext();

void setAttribite(String name,Object value) 用于将一个对象与一个名称关联后存储到当前的HttpSession对象中
String getAttribute() 用于从当前HttpSession对象中返回指定名称的属性对象
void removeAttribute(String name) 用于从当前HttpSession对象中删除指定名称的属性

案例1:把session作为一个域对象使用(会话范围,针对某个浏览器)

/**  * 从session作用域删除数据  * @return  */ public String run4(){     getSession().removeAttribute("uname");     return null; } /**  * 从session作用域获取数据  * @return  */ public String run3(){     Object uname = getSession().getAttribute("uname");     System.out.println(uname);     return null; } /**  * 向session作用域保存数据  * @return  */ public String run2(){     getSession().setAttribute("uname","严严");     return null; } 

案例2:其他API

/**      * session常见API      * @return      */     public String run5(){         String id1 = getSession().getId();         System.out.println("id1:"+id1);         boolean f = getSession().isNew();         System.out.println(f);         //立刻销毁当前session对象         getSession().invalidate();          //销毁session时,建议调用getRequest().getSession()获取到的新session //        String id2 = getSession().getId();//直接getSession()只能获取到被销毁的session         String id2 = getRequest().getSession().getId();         System.out.println("id2:"+id2);         return null;     } 

三,​​​​​​​Session原理

JavaWeb 之 必须掌握会话技术Cookie和Session, 你知道多少???(七)

四.Session生命周期

创建:第一次调用getSession() 创建

销毁:

1、服务器非正常关闭

        服务器正常关闭时,session对象会序列化方式保存到硬盘上

        下次服务器正常启动时,硬盘数据就会回到内存中。

2、主动调用invalidate()

3、超过30分钟没有调用session

总结:

会话技术:

Cookie:保存在浏览器端(客户端)会话技术

  •             创建cookie对象:new Cookie(“名字”,”值”);
  •             把cookie写出响应头:response对象.addCookie(cookie对象);
  •            获取浏览器发来的所有cookie:request对象.getCookies();//返回一个cookie数组,如果一个cookie都没有,返回null
  •             获取cookie的名字:cookie对象.getName();
  •             获取cookie的值: cookie对象.getValue();
  •            持久化cookie:

                          默认cookie:setMaxAge(-1);  浏览器关闭,销毁

                         持久化cookie:setMaxAge(大于0); 生存时间到期,销毁

  •             设置cookie有效路径:

                             请求路径 等于/包含 cookie的有效路径,该cookie会被发送给服务器

                            setPath()

  •             唯一标识:

                        覆盖保存:唯一标识相同

                       分别保存:唯一标识不同

Session:保存在服务器端的会话技术

         Session作用域。

                      Request:最小作用域。针对某次请求

                     Session:针对某个浏览器(某个用户) 会话范围(浏览器开启—-浏览器关闭)

                     ServletContext:最大作用域,针对整个项目内部

严重依赖cookie技术。 Cookie中会保存session的id。JSESSIONID

  • session.getId()获取sessionid
  • session.isNew();为true是新session
  • session.invalidate(); 立刻销毁session
  • session.setAttribute(key,value);
  • session.getAttribute(key);//返回值Object
  • session.removeAttribute(key);

session生命周期:

        创建:第一次调用getSession()

       销毁:

               1、服务器非正常关闭

                2、调用invalidate()

                3、超过30分钟未访问

看完恭喜你,又知道了一点点!!!

你知道的越多,不知道的越多! 

~感谢志同道合的你阅读,  你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!

注: 如果本篇有需要改进的地方或错误,欢迎大神们指定一二~~

潇洒哥, 程

关于作者: 潇洒哥

为您推荐