目录

 

会话技术

一.Cookie入门

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

三,Cookie原理

四.Cookie使用注意

五.Cookie种类(持久化)

六.Cookie有效路径

七.Cookie唯一标识

Session

一.简述&入门案例

二.常见API

三,Session原理

四.Session生命周期

总结:


会话技术

java服务端会话凭证 java会话技术_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;
}

java服务端会话凭证 java会话技术_cookie_02

 

小结:

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原理

java服务端会话凭证 java会话技术_session_03

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

 

 

 

 

四.Cookie使用注意

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

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

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

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

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

localstorage 4G

 

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

3、cookie不能直接保存中文

java服务端会话凭证 java会话技术_session_04

不允许,报错。500

 

间接存中文

 

 

java服务端会话凭证 java会话技术_web_05

java服务端会话凭证 java会话技术_web_06

获取到值使用时,需要进行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,追加保存

域名:http://www.czxy.com  有效路径:/hehe  cookie名:k1

域名:http://www.baidu.com 有效路径:/hehe  cookie名:k1

 

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

域名:http://www.czxy.com  有效路径:/hehe  cookie名:k1

域名:http://www.czxy.com  有效路径:/xixi  cookie名:k1

 

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

域名:http://www.czxy.com  有效路径:/hehe  cookie名:k1

域名:http://www.czxy.com  有效路径:/hehe  cookie名:k2

 

 

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

域名:http://www.czxy.com  有效路径:/hehe  cookie名:k1

域名:http://www.czxy.com  有效路径:/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原理

java服务端会话凭证 java会话技术_java服务端会话凭证_07

 

 

 

 

四.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分钟未访问

 

 

 

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

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

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

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