【JavaWeb】之Cookie与Session的区别

首先呢,为了更好让大家理解Cookie和Session的区别,首先的我们将重点先放到认识Cookie和Session上,撒!

Cookie详解

​ Cookie鉴名之意是甜品,小饼干的意思,这当然是从现实生活中的实例中抽象出来的概念,现在我举一个例子再 将其映射到现实生活中,大家一下就能理解了。

​ 比如我是一个学校的学生,我现在要进学校了,这时候学校的门岗突然拦住我,跟我说:你怎么证明你是这个学校的学生呢? 然后我反手就从口袋里拿出了学生证,这样门岗就相信了我是学校的学生,我也如愿以偿的进入了学校。这样一个例子其实就是Cookie的一个映射,映射的主题就是身份认证

​ 那么问题来了,通过上面这个例子可以分出两种情况

  • 第一次来学校

    进行学校报名的时候,我是没有学生证的,这也就是说,我完成报名之后,学校会给我一个身份认证学生证,来证明我来过。

  • 第一次之后进学校

    我已经完成报名的手续了,学校也给我发过身份证明了,等我在来的时候,我只需要带上学生证就可以了。

Cookie也是这个道理,具体的应用就是网站登录的时候,你只需要登录一次就可以,后续就不需要重复登录了,这也是小小的Cookie帮你完成的访问网站底层的操作。

Cookie的应用

创建Cookie

​ 大家可以看到,创建Cookie的构造方法中传了两个字符串形式的实参,这个是键值对形式的参数(K:V)一一对应

Cookie cookie = new Cookie("name", "喜多川");   

获取Cookie的名称

​ 创建Cookie时第一个参数就是名称,第二个参数是名称对应的Cookie的值,也就是Value。

cookie.getName();

获取Cookie的值

cookie.getValue();

服务器端响应时,添加Cookie信息

​ 换句话说就是在上面那个例子中,校方给你发学生证的动作。

Cookie cookie = new Cookie("name", "喜多川");   
resp.addCookie(cookie);     //将创建的cookie信息通过response的方式响应给浏览器

设置Cookie的有效期

​ 括号中的参数是以为单位。

Cookie cookie = new Cookie("name", "喜多川");   
cookie.setMaxAge(1);	 //设置cookie的有效期

代码奉上,便于理解


/**
 *  该类意为展现cookie的应用
 */
public class CookieDemo extends HttpServlet {

    @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");


        Cookie[] cookies = req.getCookies();    //一个请求可以包括多个cookie,所以获取时可以是多个
        
        if (cookies.length>1) {   //之所以这里设置大于1,是因为服务器自动创建了基于cookie携带session的id,后续会讲
            //如果条件成立,说明我们成功获取到了cookie
            for (Cookie cookie : cookies) {
                if ("name".equals(cookie.getName())) {
                    String value = cookie.getValue();
                    resp.getWriter().println("已成功验证身份信息 "+cookie.getName()+value);
                }
            }
        }else{
            //否则我们手动从后台创建cookie,使用response的方式响应回去
            resp.getWriter().println("这是你第一次访问该网站,已成功创建身份认证(cookie)");
            Cookie cookie = new Cookie("name", "喜多川");      //手动创建cookie
            cookie.setMaxAge(3);    //设置cookie的有效期
            resp.addCookie(cookie);     //将创建的cookie信息通过response的方式响应给浏览器
        }


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

代码写完之后,记得去web.xml中注册

    <servlet>
        <servlet-name>CookieDemo1</servlet-name>
        <servlet-class>com.darling.CookieDemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieDemo1</servlet-name>
        <url-pattern>/c1</url-pattern>
    </servlet-mapping>

Tomcat启动后访问网址就是

http://localhost:8080/c1

Session详解

​ Session可以说是Cookie的简化版,因为Session本质上也是Cookie,具体体现在Session是基于Cookie来传递信息的(记住这句话,往下看我会讲),但是还是有不同的地方的。

​ Session鉴名之意是会话的意思,那么什么具体的操作被称为完整的一次会话呢? 那就是你打开浏览器和关闭浏览器这两个动作,就相当于是完成了一次完整的会话了。怎么样很简单吧!

​ 首先Session这个消息是由服务器创建的,既然是由服务器创建的,那就表示只有特定的请求访问特定服务器的时候才会响应并处理,才会创建Session,并不是所有服务器都搭载了Session技术,反过来说不是所有请求都会收到服务器的Session的创建信息。这也就澄清了一个大家对Session的误区,认为Session是浏览器打开之后就存在的误区,其实应该是在浏览器打开之后,会话就被建立了,这充其量是为Session提供了生成的环境区间,但是是否生成Session还是要看本人访问什么样的网站,所访问的网站是否搭载的Session技术!!!

​ 为了证明我的说法,接下来我将开始论证:

代码如下:

public class SessionDemo extends HttpServlet {
    @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的ID,这个是由服务器生成的,每一次会话都会创建一个ID
        if (session.isNew()) { 	//session.isNew()这个方法是判断Session是否是新生成的
            resp.getWriter().println("Session是新的");
        }else{
            resp.getWriter().println("Session是旧的");
        }
        
        //页面输出Session的ID
        String session_id = session.getId();
        resp.getWriter().println(session_id);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

首先我将Tomcat10启动起来,得到如下图结果:

在这里插入图片描述

在键入我们注册好的网址s1,显示结果如下:

在这里插入图片描述

我们在换个浏览器直接访问,得到结果如下:

在这里插入图片描述

显示我们的Session的ID是新的,这也就说明Session并不是浏览器打开的时候就创建的。

所以有一个大胆的猜想,是不是我们访问了特定的网址,已经给了我们SessionID的呢?结果的确是的,是因为我们打开Tomcat10的时候已经自动访问了**https://localhost:8080**这个网址,所以已经给了我们SessionID了,我们在访问https://localhohst:8080/s1的时候就会判断我们已有的SessionID是旧的ID,验证如下:

在这里插入图片描述

可以看到我们访问localhost:8080的时候,Response Headers 服务器的响应头中带了一个Set-Cookie的信息,这就是Session的ID!!!

以上就是证明,Session是由服务器创建的,并不是打开浏览器就创建的对象。

Session的本质

细心的小伙伴可能就发现了,我们最后这张Hello World的图片中,当服务器将创建的Session响应给客户端的时候是借用Set-Cookie的方式传给客户端的,这也就证明了Session的本质也是Cookie,在附一张图:

在这里插入图片描述

大家可以清除的看到,Session的ID也是使用被Cookie携带的方式,发送请求给服务器的!!!

这样的话其实我们可以大胆的猜想,是不是可以使用Cookie这样来实现呢!!!

Cookie cookie = new Cookie("JSESSIONID", "D4041DAFED4F04689EBA06D21A062637");
resp.addCookie(cookie);

综上所述Session的本质是Cookie

Session的应用

​ 这里介绍一些常用的,出现率高的方法。

获取Session对象

//注意是从请求中获取
HttpSession session = req.getSession();		

获取SessionID

HttpSession session = req.getSession();	
String session_id = session.getId();

使用Session共享数据

​ Session数据的存储方式跟Cookie不太一样,回顾一下Cookie是可以存储K:V的键值对形式的值,而且这个两个值必须都是字符型的,而Session的确也是K:V键值对方式存储,但是键是字符型,值是Object类型,也就是说它的值是可以存储对象的。

//存储键对应的字符串
session.setAttribute("name1","张三");	
//存储键对应的Person对象
session.setAttribute("name2",new Person("李四",18,"女"));
//取出key为name1的值
String name1 = (String)session.getAttribute("name1");
//取出key为name2的值
Person name2 = (Person) session.getAttribute("name2");    

注销Session

​ 手动注销,使Session失效,Session一旦失效,那么SessionID将被注销,使用Session存储中的数据也将不复存在

session.invalidate();

Session自动失效

​ 这个设置的方法分为两种。第一种是使用Session对象提供的方法,第二种是在Web.xml中配置相应的属性。

  • Session对象提供的方法

    //方法内需填充的参数是以秒为单位,当前是设定Session将在重生后10秒内死亡
    session.setMaxInactiveInterval(10);
    
  • Web.xml中属性配置

    <!--设置Session自动失效-->
        <session-config>
    		<!-- 设置Session自动失效时间,默认为分钟-->
            <session-timeout>10</session-timeout>
        </session-config>
    

Cookie和Session的区别

​ 前面铺垫了这么久,终于到了回归主题的时候啦!

  • 创建方式的区别

    Cookie虽然是由服务器的请求来传递的,但是并非是由服务器创建的。

    Session是由服务器创建的,并使用Cookie携带的方式传递的。

  • 生存周期的区别

    Cookie的数据是存在浏览器的本地的,换句话说就相当于浏览器的缓存,是持久化存储的标志。

    Session的数据是在打开浏览器的时候是给予了Session的生存环境,当你关闭浏览器的时候,

    Session的生命也就消逝了,但是数据是存在服务器的。

  • 共享数据的区别

    Cookie只能简单的实现键值对的方式传递数据。

    Session虽然也是使用键值对的方式管理数据,但是实现了键对应对象的技术,大大解决了

    传递数据的局限性

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡特霖娜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值