Cookie与Session的辨析

Cookie与Session的详析

1. 会话

概念:会话是浏览器和服务器之间的多次请求和响应。即从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话

有状态会话

小例子:你怎么证明你是北大的学生?

你 北大

  1. 发票 北大给你发票
  2. 学校登记 北大标记你来过了

同理,一个网站,如何证明你来过

客户端 服务端

1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;	cookie
2. 服务器登记你来过了,下次你再来的时候,我来匹配你;   session

2. 保存会话的两种技术

cookie——客户端会话技术
session——服务器会话技术

常见:网站登录之后,下次不用再登陆,而是直接就有了!

3. Cookie技术

  1. 从请求中拿到cookie信息

  2. 服务器响应给客户端cookie

    // 设置请求和响应的字符集格式,避免中文乱码问题
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
    
            //告诉浏览器,服务器发送的消息体的数据的编码
            resp.setHeader("content-type","text/html;charset=utf-8");
            //中文输出乱码问题,上一行的代码就是解决这个问题的
            PrintWriter out = resp.getWriter();
    
            // Cookie,服务器从客户端获取
            Cookie[] cookies = req.getCookies(); //这里返回的是数组,说明cookie可能存在多个
    
            //判断cookie是否存在
            if(cookies!=null){
                //如果存在
                out.write("您上次访问的时间是:");
                //第一种遍历方式
    //            for (Cookie cookie : cookies) {
    //                // 获取Cookie的名字
    //                if(cookie.getName().equals("lastLoginTime")){
    //                    //获取cookie中的值
    //                    cookie.getValue();
    //                }
    //            }
                //第二次遍历方式(更灵活,因为可以任取下标)
                for (int i = 0; i <cookies.length; i++) {
                    Cookie cookie = cookies[i];
                    // 获取cookie的名字
                    if(cookie.getName().equals("lastLoginTime")){
                        //获取cookie中的值
                        long lastLoginTime = Long.parseLong(cookie.getValue());
                        Date date = new Date(lastLoginTime);
                        out.write(date.toLocaleString());
                    }
                }
            }else{
                out.write("这是您第一次访问本站");
            }
    
            // 服务端给客户端响应一个cookie
            Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
            // 设置cookie有效期为一天
            cookie.setMaxAge(60*60*24);
            resp.addCookie(cookie);
    

    **cookie:一般保存在本地的用户目录下的AppData **

    一个网站cookie是否存在上限?聊聊细节问题

    * 一个web站点可以给浏览器发送多个cookie
    * Cookie大小有限制4kb
    * 300个cookie浏览器上限
    

    (1) 注意:
    Cookie具有不可跨域名性
    ookie保存中文乱码问题:中文属于Unicode字符,英文数据Ascii字符,中文占4个字符或者3个字符,英文占2个字符,Cookie使用Unicode字符时需要对Unicode字符进行编码
    Cookie cookie = new Cookie("xxx",URLEncoder.encode(name,"UTF-8"))

    删除Cookie的两种方式

    • 不设置有效期,关闭浏览器后,cookie自动删除
    • 设置有效期时间为0

    注意:在传输编程中,字符传输需要解码编码

    当req.setCharacterEncoding(“utf-8”);

    ​ resp.setCharacterEncoding(“utf-8”); 不起作用时,

    比较好的解决方式

    // 解码
    URLDecoder.decode();
    // 编码
    URLEncoder.encode();
    

    image-20230723144737282

4. Session(重点)

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象;

  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就在存在;

  • 用户登录之后,整个网站它都可以访问!–> 保存用户的信息

    比如:保存购物车的信息…

    image-20230723144706485

Session和cookie的区别:

* Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
* Session把用户的数据写到用户独占Session中,服务端保存(保存重要的信息,减少服务器资源的浪费)
* Session对象由服务创建

使用场景:

* 保存一个登录用户的信息;
* 购物车信息;
* 在整个网站中经常会使用的数据,我们将它保存在Session中;

使用Session:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    //解决乱码问题
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    //得到Session
    HttpSession session = req.getSession();
    //给Session中存东西
    session.setAttribute("name","秦疆");
    //获取Session的ID
    String id = session.getId();
    //判断Session是不是新的创建
    if (session.isNew()) {
        resp.getWriter().write("session创建成功了,ID: "+id);
    }else{
        resp.getWriter().write("session以及在服务器中存在了,ID: "+id);
    }

    //Session创建的时候做了什么事情
    //Cookie cookie = new Cookie("JSESSIONID",id);
    //resp.addCookie(cookie);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    //解决乱码问题
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");

    //得到Session
    HttpSession session = req.getSession();

    String name = (String) session.getAttribute("name");
    System.out.println(name);



}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req,resp);
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    HttpSession session = req.getSession();
    session.removeAttribute("name");
    //手动注销Session
    session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
}

会话自动过期:web.xml配置

<!-- 设置Session默认的失效时间 -->
<session-config>
    <!-- 15分钟后Session自动失效,以分钟为单位 -->
    <session-timeout>15</session-timeout>
</session-config>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值