Cookie-Session

概念

关于Cookie和Session,我想有人还处于对它们迷迷糊糊的状态,今天我们就狠狠的区别它。

首先介绍一下它们是干嘛的,也就是它们的共同点。

我们知道的,http是一个无状态的协议,在通信过程中,通信的双方不会在通信的上下文中保存任何信息。这意味着每次通信都是独立的,不依赖于之前的通信状态。

欸欸欸!那就可麻烦了。那类似购物的话,岂不是每次去淘宝买东西,我都得登录一下?

不是,Cookie和Session的作用就是为了给我们减少麻烦,保存我们的信息,避免我们下次购买商品时还要登录。

Cookie

想象一下你去了一家咖啡店,当你第一次去的时候,店员会给你一个小卡片,这个卡片上记录了你的一些基本信息,比如你最喜欢的咖啡口味,或者你上次买的咖啡的数量。这张小卡片就相当于是一个Cookie。

当你下次再去这家咖啡店的时候,店员不需要再问你:“请问您想要什么口味的咖啡?”因为他们看到你的卡片就知道了。他们会直接为你准备你最喜欢的咖啡口味。在这个场景中,卡片(也就是Cookie)就帮助咖啡店“记住”了你的喜好。

同样地,当你在网上浏览网页时,很多网站也会使用类似的小卡片(Cookie)来“记住”你。比如,你登录了一个网站,网站会给你一个Cookie,这个Cookie里包含了你的登录信息。下次你再访问这个网站时,网站就能通过读取这个Cookie知道你已经登录过了,然后就可以直接为你展示你的个人信息或者让你进入会员区域。

Cookie相关知识点

  1. cookie是在浏览器中保存的。
  2. 如果想要使用cookie要保证我们的浏览器是开启cookie,所以说有一定的弊端,如果浏览器没有开启cookie,就不能再使用cookie了。
  3. cookie的大小是有限制的,通常是4096byte
  4. cookie的保存是以键值对的形式存在的

Cookie常用语法

//1.cookie的构造方法,目的是实例化出来cookie对象
Cookie(String key,String value)
//2.设置cookie的方法
setValue(String value) //插入或修改cookie的值
getValue(String value) //获得cookie的值    
getName(String value) //获得cookie的键    
setMaxAge(int time) //设置cookie的有效时间
//3.要将cookie发送到浏览器
response.addCookie(Cookie cookie);
//4.获得所有cookie
request.getCookies();

例1:设置Cookie值

public class SetCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws Exception {
        /**
         * 1.创建cookie对象
         *     将
         *     键:msg 
         *     值:sb ,存到cookie对象中
         */
        Cookie cookie = new Cookie("msg", "sb");
        /**
         * 2.设置有效时间
         *    正数:表示当前cookie的有效时间
         *    负数:表示当前浏览器打开的时候存在,关闭的时候没了
         *     0:销毁当前的cookie
         */
        cookie.setMaxAge(60*60*24);//设置了有效期是个正数,
        //3.把cookie发送到浏览器
        response.addCookie(cookie);
    }
}

例2:获取Cookie值

  protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        //获取浏览器中cookie,返回值是一个数组
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            System.out.println("==============");
            System.out.println(cookie.getName());//获取键
            System.out.println(cookie.getValue());//获取值
        }
    }

例:销毁Cookie值

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        //退出登录
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("msg")){
                cookie.setMaxAge(0);//销毁cookie
                //重新发送给浏览器
                response.addCookie(cookie);
            }
        }
    }

Session

从上面了解到了Cookie的用法,接下来我们了解一下Session。在这之前,我想有人一直有个疑问,Session和Cookie都是浏览器用于保存信息的,有了Cookie为什么还要用Session?

它们是有区别的,而且用途不一样:

  1. 存储位置

    • Cookie:数据信息存放在客户端的浏览器上。
    • Session:数据信息存放在服务器上。
  2. 存储容量

    • Cookie:单个cookie保存的数据通常不超过4KB,一个站点最多可以保存20个Cookie。
    • Session:对于session来说并没有明确的容量上限,但出于服务器性能考虑,不建议在session中存放过多的数据。
  3. 存储内容

    • Cookie:主要存储的是一些简单的文本信息,如用户名、密码的加密串等。
    • Session:由于存储在服务器上,可以存储更复杂的数据结构,如用户信息、登录状态、浏览历史等。
  4. 安全性

    • Cookie:对客户端是可见的,可以被用户或恶意软件读取和篡改,因此存在一定的安全风险。
    • Session:存储在服务器上,对客户端是透明的,相对更安全。但如果服务器存在安全漏洞,Session也可能被窃取。
  5. 有效期

    • Cookie:可以通过设置maxAge属性来控制过期时间,可以长期有效。
    • Session:依赖于名为JSESSIONID的cookie,这个cookie的过期时间默认为-1,即浏览器关闭窗口后session就失效。但也可以通过服务器设置来延长session的有效期。
  6. 服务器压力

    • Cookie:不占用服务器资源,对服务器压力小。
    • Session:每个用户都会产生一个session,如果并发访问的用户很多,会消耗大量的服务器资源。
  7. 浏览器支持

    • Cookie:需要客户端浏览器的支持,如果浏览器禁用了cookie或不支持cookie,会话跟踪会失效。
    • Session:不依赖于浏览器对cookie的支持,但如果浏览器不支持cookie,则需要使用URL地址重写等方式来传递session id。
  8. 跨域支持

    • Cookie:支持跨域名访问。
    • Session:仅在他所在的域名内有效,不支持跨域名访问。

Session常用语法

没有大小的限制

信息的保存也是以键值对的形式存在的

request.getSession(); //返回HttpSession
setAttribute(key,value); //设置属性 key ,value
getAttribute(key); //获取key的值
removeAttribute(String key)	//通过key值删除数据
invalidate(); //将session中的变量全部清空
setMaxInactiveInterval(int interval); //设置session失效时间,单位为秒
getMaxInactiveInterval();//获取session失效时间
getId(); //获取sessionID

例1:设置Session

public class SetSessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response){
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        //1.获取session对象
        HttpSession session = request.getSession();
        System.out.println(session);
        //获取的是JSESSIONID 服务器唯一的标识
        System.out.println(session.getId());
        //给session设置一个时间,有效果的,里面放的是秒
        session.setMaxInactiveInterval(60*60*24);

        User user = new User();
        user.setUsername("Kitty");
        user.setBirthday(new Date());
        user.setSex("1");
        session.setAttribute("user",user);
    }

例2:获取Session

public class GetSessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response){
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        //1.获取Session对象
        //第一次创建session的时候默认为true
        //false的话,这个session使用的是已经创建好的session对象
        HttpSession session = request.getSession(false);
        //2.获取session,通过键取值
        Object user = session.getAttribute("user");
        System.out.println(user);
    }

例3:清空Session

public class DestroySessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)  {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)  {
        //1.获取session对象
        HttpSession session = request.getSession();
        //销毁当前的session
        session.invalidate();
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值