【JavaWeb】cookie和session学习笔记

目录

执行原理:

相关方法:

cookie的特点:

session

基本使用:

执行原理:

session的声明周期:

cookie和session小结:


      上篇博客分享了关于request和response的学习,今天介绍一下关于cookie和session的学习。

      cookie和session是一种会话技术,那么什么是会话技术呢?在日常生活中,从拨通电话到挂断电话之间的一连串你问我答的过程就是一个会话,在B/S架构中,从浏览器第一次给服务器发送请求时开始建立会话,直到一方断开,会话结束.再一次会话中包含了多次请求. 

      cookie:浏览器端会话技术(数据保存到浏览器上)

      session:服务器端会话技术(数据保存在服务器上)

    cookie将产生的数据保存在浏览器端,在服务器端创建,是一种key/value的格式,通过响应写会浏览器的,下次请求的使用按照一点的规则携带cookie到服务器上.

执行原理:

相关方法:

构造器:

new  Cookie(String name, String  value)

写回浏览器方法:

response.addCookie(Cookie c)

获取cookie:

request.getCookies()

cookie方法:

----->getName()   :获取cookie的名字

----->getValue()    :获取cookie的值

注意:

        1)响应的cookie是通过set-cookie的响应头带回给浏览器的

        2)请求的cookie是通过cookie的请求头发送给服务器的

代码案例:

public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //有数据产生 需要被保存
        Cookie cookie = new Cookie("ds" , "James");

        //保存数据 将cookie交给响应对象 响应给了浏览器
        response.addCookie( cookie );
    }
}
public class TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //根据请求获得cookie数据
        Cookie[] cookies = request.getCookies();
        //判断cookie
        if(cookies != null){
            //遍历
            for (Cookie cookie : cookies) {
                //获得cookie的名称 和 cookie值部分
                System.out.println(cookie.getName() +"====" + cookie.getValue());
            }
        }else{
            System.out.println("暂时还没有获取到cookie的信息");
        }
    }
}

       会话级别的cookie:浏览器打开服务器到浏览器关闭的时候,此次会话过程中的数据保存在会话结束cookie就消失了

    API

方法名作用
setMaxAge(int 秒数)设置cookie在浏览器的存活时间 , 设置持久化级别的cookie
setPath("路径")设置cookie的路径,规定访问页面的时候携带哪些cookie setPath("/")

setMaxAge(int 秒数)

  • 若为正整数的时候,设置指定的存活时间
  • 若为负数的时候,浏览器关闭的时候,此cookie销毁
  • 如果0的时候,立即销毁此cookie(路径一致)
public class OneAPIServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //有数据产生 需要被保存
        Cookie cookie = new Cookie("dzd" , "小强3333");

        //设置cookie的存活时间(1天)
        cookie.setMaxAge(60 * 60 * 24 * 7);//单位秒
    }
}

    设置路径问题:

     1.cookie的默认路径为:访问的servlet的路径,从项目的应用路径开始,到最后一个"/"结束.

例如:访问路径为:"/day08_cookie/demo01",cookie的默认路径为/day08_cookie       

访问路径为"/day08_cookie/a/demo1" ,cookie的默认路径/day08_cookie/a

    2.当我们访问url包含此cookie的路径,就会携带此cookie,若不包含就不携带.

例如{一下三个路径}:

  • cookie1的路径: /day08_cookie/a/b

  • cookie2的路径: /day08_cookie/a

  • cookie3的路径: /day08_cookie

当我们访问一下路径的时候,携带cookie的数量不同:

 

  1. 访问的路径为 http://localhost/day08_cookie/a/b/1.html的时候,会携带3个cookie
  2. 访问的路径为 http://localhost/day08_cookie/a/1.html的时候,会携带2和3这俩cookie
  3. 访问的路径为 http://localhost/day08_cookie/1.html的时候,会携带第3个cookie

cookie的特点:

  • 一个浏览器下一个名字和一个路径只能确定一个cookie,若再写回来同名cookie会覆盖之前的cookie
  • 名字或路径不通,cookie就可以同时存在
  • cookie不能跨浏览器
  • cookie的value可以存放中文(tomcat8 ),但是不能存放空格   ","和";"
  1. 如果有这些特殊符号的时候,我们需要先将value进行编码,获取到值之后再按指定的编码进行解码即可
  2. 编码的时候建议使用URLEncode.encode("要编码的字符串","utf-8")
  3. 解码的时候建议使用URLDecode.decode("要解码的字符串","UTF-8")
public class TeShu_Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String s = "我爱你,中 国;";
        //编码
        String s_8 = URLEncoder.encode(s, "utf-8");
        Cookie cookie = new Cookie("demo1", s_8);
        response.addCookie(cookie);

        //第一次获取不到此cookie的,但是第一次之后再访问就可以获取了
        Cookie[] cookies = request.getCookies();
        if (cookies!=null&&cookies.length>0) {
            for (Cookie c : cookies) {
                if ("demo1".equals(c.getName())) {
                    String value = c.getValue();
                    //解码
                    value = URLDecoder.decode(value,"utf-8");
                    System.out.println(value);
                }
            }
        }
    }
}

session

    服务器端会话技术:在一次会话的多次请求之间共享数据,将数据保存到服务器端

    工作流程:

    当浏览器访问服务器的时候,服务器会看浏览器是否携带了id(JSESSIONID)

     如果没有带,服务器会在服务器上创建一块空间,然后操作数据,服务器会将这个控件的id(JSESSIONID)通过响应返回给浏览器

     如果携带,服务器获取这个id,通过id去内存中查找是否有这块空间{如果存在,会直接将 数据存入这块控件,如果没有找到,服务器会在服务器上创建一块空间,操作数据,服务器会将这个空间的id(JSESSIONID)通过响应返回给浏览器}

基本使用:

常用方法:

setAttribute(String key , Object value)     设置属性值

getAttribute(String key)                              获取属性值

removeAttribute(String key)                       移除属性值

执行原理:

代码案例:

public class SessionOneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获得session(第一次调用会创建session对象)
        HttpSession session = request.getSession();

        System.out.println(session);
        System.out.println(session.getId());//手动获得session的id
        System.out.println(session.isNew());//是不是新创建的

        session.setAttribute("ds","James");
    }
}
public class SessionTwoServlet extends HttpServlet {
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获得session(第一次调用会创建session对象)
        HttpSession session = request.getSession();

        System.out.println(session);
        System.out.println(session.getId());//手动获得session的id
        System.out.println(session.isNew());//是不是新创建的
        System.out.println( session.getAttribute("ds")  );
    }
}

session的声明周期:

创建:默认情况下,第一次访问reqeust.getSession()创建

销毁:

  • 默认tomcat服务器中,超过三十分钟销毁(一个session如果30分钟内没有任何人操作,自动销毁)
  • 手动调用invalidate方法销毁
  • 服务器非正常关闭则销毁(死机,蓝屏)

     服务器正常关闭: 将内存的session数据序列化到了本地磁盘上(work下 sessions文件中) , 再次启动服务器 加载session文件 到内存, 数据再加载回来 数据并没有消失

cookie和session小结:

  • cookie:数据存储再来浏览器,cookie存储的数据优先,cookie不安全
  • session:数据存储在服务器,session存储数据无限(取决于服务器的大小,session相对安全)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值