7、Cookie与Session

本文详细介绍了Web会话管理中的Cookie和Session技术。Cookie用于在客户端保存信息,通过设置有效期实现持久化,而Session则在服务器端保存用户数据,确保会话状态。讨论了Cookie和Session的使用场景、操作方法以及两者之间的区别,包括它们在存储位置、安全性及信息量方面的差异。此外,还涵盖了如何创建、读取、修改和删除Cookie以及Session的方法。
摘要由CSDN通过智能技术生成

7.1、会话

会话: 用户打开浏览器, 点击了很多超链接, 访问了多个web资源, 关闭浏览器。这个过 程可以称之为会话
有状态的会话: 一个同学来过教室, 下次再来教室, 我们就会知道这个同学曾经来过, 称之 为有状态的会话
如何让服务端证明客户端来过?
①服务端给客户端一个"信件"(Cookie)下次访问服务端带上信件就可以了; Cookie
②服务器
登记
你来过了, 下次来就可以直接与服务器匹配; Session

7.2、保存会话的两种技术

cookie
客户端技术(响应、请求)
session
服务器技术: 利用这个技术, 可以保存用户的会话信息! 可以把信息或者数据放在 Session中!

常见场景: 网站登陆之后, 以后就会自动登录



7.3、Cookie

1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
![image.png](https://img-blog.csdnimg.cn/img_convert/8274cbcd226a3441b595e800b71ed606.png#clientId=ucc7cfb0b-41d7-4&from=paste&height=441&id=UyqS0&margin=[object Object]&name=image.png&originHeight=513&originWidth=771&originalType=binary&ratio=1&size=172222&status=done&style=none&taskId=u940fb906-0b03-48d8-8d27-81824b7405d&width=662.5)

 	Cookie[] cookies = request.getCookies();//服务器从客户端获取Cookie
	cookie.getName()//获得Cookie的健
    cookie.getValue()//获得Cookie的值
    Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");//新建一个Cookie
	cookie.setMaxAge(24*60*60);//设置Cookie有效期
	response.addCookie(cookie);//服务器给客户端发送一个Cookie
    

cookie:一般会保存在本地的 用户目录下appdata;


细节问题
一个Cookie只能保存一个信息
一个web站点可以给浏览器发送多个cookie, 最多存放20cookie
cookie大小限制为4kb
300个cookie浏览器上限

package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

@WebServlet(name = "Cookie_1", value = "/Cookie_1")
public class Cookie_1 extends HttpServlet {
    //保存用户上一次访问的时间
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //服务器, 告诉你,你来的时间, 把这个时间封装成为一个"信件"(Cookie), 你下次带来你我就知道你来了

        //解决中文乱码
        request.setCharacterEncoding("GBK");
        response.setCharacterEncoding("GBK");

        PrintWriter out = response.getWriter();

        //Cookie, 服务器端从客户端获取;
        Cookie[] cookies = request.getCookies();//Cookie可能有多个

        //判断Cookie是否存在
        if (cookies != null) {
            //如果存在
            out.print("你上次访问时间是: ");

            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.print(date.toLocaleString());
                }
            }
        }

        //给服务器给客户端发送一个cookie(其实就是一个键值对)
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        response.addCookie(cookie);

        //设置Cookie的有效期
        cookie.setMaxAge(24*60*60);//有效期为一天
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

删除Cookie:
①不设置有效期, 关闭浏览器, 自动失效;
②设置有效期为0
③创建另一个Cookie手动删除

package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "Cookie_2", value = "/Cookie_2")
public class Cookie_2 extends HttpServlet {
    //保存用户上一次访问的时间
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //服务器, 清除原有的Cookie(Cookie_1)

        //解决中文乱码
        request.setCharacterEncoding("GBK");
        response.setCharacterEncoding("GBK");

        //创建一个Cookie, 名字必须与要删除的名字一致
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");

        cookie.setMaxAge(0);//有效期为0

        response.addCookie(cookie);//发送出去刷新lastLoginTime的cookie
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

编码解码问题

乱码解决方案: URLEncoder.encode("身伤易逝","utf-8")  //编码
 			URLDecoder.decode(cookie.getValue(), "UTF-8");  //  解码



7.4、Session(重点)

什么是Session(会话):
①服务器会给每一个用户创建一个Session的对象
②一个Session独占一个浏览器, 只要浏览器不关 ,这个Session就一直存在;
③用户登录之后, 整个网站它都可以访问! 保存用户、购物车的信息……
![image.png](https://img-blog.csdnimg.cn/img_convert/f2197f10302a58a42e272c9abd2adcef.png#clientId=ucc7cfb0b-41d7-4&from=paste&height=379&id=ud46ad2d9&margin=[object Object]&name=image.png&originHeight=487&originWidth=732&originalType=binary&ratio=1&size=209843&status=done&style=none&taskId=uc5bcb4fb-d29d-44c3-99c9-985e9de4dbf&width=570)
使用场景:
①保存一个登陆用户的信息;
②购物车信息;
③在这个网站中经常会使用的数据, 我们将它保存在Session中;

获取Session:

        //服务器得到Session
        HttpSession se = request.getSession();

        //给Session中存东西
        se.setAttribute("name", "身伤易逝");//存一个字符串

        Student stu1 = new Student("身伤易逝",19);
        se.setAttribute("stu1", stu1);//存一个对象

        //获取SessionId
        String sessionId = se.getId();

        //判断Session是不是新创建
        if (se.isNew()) {
            response.getWriter().println("session创建成功" + sessionId);
        } else {
            response.getWriter().println("session已经在服务器存在,ID: " + sessionId);
        }

得到Session的信息:


        //服务器得到Session
        HttpSession se = request.getSession();

        String name = (String) se.getAttribute("name");
        Object stu1 = se.getAttribute("stu1");
        response.getWriter().println("name : " + name);//打印信息
        response.getWriter().println("stu1 : " + stu1.toString());//打印对象

移除Session及信息

        //服务器得到Session
        HttpSession se = request.getSession();

        se.removeAttribute("name");//移除该信息

        //手动注销Session
        se.invalidate();//注销Session

Session自动过期

    <!--设置Session默认的失效时间-->
    <session-config>
        <!--15分钟后Session自动失效 以分钟为单位-->
        <session-timeout>5</session-timeout>
    </session-config>

7.5、Cookie与Session的区别

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值