java学习之浅谈Cookie与Httpsession对象

简介: java学习之浅谈Cookie与Httpsession对象

一.引言



   日常生活中,当我们访问一个网站时,输入账号密码登录之后,离开一段时间回来发现网站仍然处于登录状态,但是有时我们回来就会显示再次登录了,或者有时我们关闭浏览器页面,下次再次访问还会显示登录成功,但是当我们换一个浏览器就会显示重新输入账号密码才可以进行登录,不论日常生活还是我们网安研究人员或多或少都会有点理解,但是其原理是什么呢?

     在我们熟悉的servlet中有Cookie与HttpSession对象(会话对象),servlet可以理解为连接前端与服务端的接口,我们浏览界面时将请求通过servlet发送至服务端,之后服务端再通过servlet将响应包呈现到我们面前,这就是servlet工作的基本原理。    

二.Cookie对象

       Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,不需要网络连接,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于Cookie是服务器端保存在客户端的信息,所以其安全性也是很差的。例如常见的记住密码就可以通过Cookie来实现。

       servlet中有一个专门操作Cookie的类javax.servlet.http.Cookie,随着服务器的响应发送给客户端,保存在浏览器,当下次访问时再将Cookie带回服务器。

       Cookie格式:键值对用"="链接,多个键值对利用":"隔开

       当我们利用servlet创建Cookie对象时,会利用键值对的形式加入response对象中来完成创建:


//创建Cookie对象Cookie cookie = new Cookie("name","admin")//发送Cookie对象response.addCookie(cookie);

       创建完成之后发送cookie对象给浏览器来进行查看:

f2d22b36c774d0fc88cd0e9616377046.png

bf9f08ab3509ae0eee030e4ee76551c9.png

     刚才说到,当我们长时间不登陆或者几天不登陆,也可以直接免密登录,这就涉及到Cookie对象的到期时间的设置,默认当前浏览器关闭即失效,我们也可以手动设定cookie到期时间(通过到期时间计算),通过setMaxAge(int time)方法设定cookie最大有效时间,以秒为单位

到期时间的取值

  • 负整数

若为负数,表示不存储该cookie.

cookie的maxAge属性的默认值为-1,表示只在浏览器内存中存活,一旦关            闭浏览器窗口,那么cookie就会消失。

  • 正整数若大于0的整数,表示存储的秒数表示cookie对象可存活指定的秒数,当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活响应的时间。
  • 若为零,则删除此cookiecookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie.

注:到期时间是指当前时间加有效时间,当到期时间为-1时,即关闭时,到期时间为当前时间-1,所以当到期时间为-1时,浏览器关闭时就会删除此cookie。
而且需要注意的是,每个浏览器的Cookie都是一个文件,所以当我们换一个浏览器时就会显示重新登录。

三.HttpSession对象
       HttpSession对象是javax.servlet.http.HttpSession的实例,该接口不像HttpServletRequest或HttpServletResponse还存在一个父接口,该接口只是一个纯粹的接口。这因为session本身就属于HTTP协议的范畴。        对于服务而言,每一个连接到它的客户端都是一个Session,servlet容器使用此接口创建HTTP客户端的HTTP服务器之间的会话,会话将保留指定的时间段,跨多个连接或者来自用户的页面请求,一个会话通常对应于一个用户,该用户可能多次访问一个站点。可以通过此接口查看和操作有关某个会话的信息,比如会话标识符,创建时间和最后一次访问时间,在整个Session中,最重要的就是属性的操作。        Session无论客户端还是服务器端都可以感知到,若重新打开一个新的浏览器,则无法取得之前设置的session,因为每一个session只保存在当前的浏览器中,并在响应的页面取得。        Session的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。我们可以通过request.getSession()的方法,来获取当前会话的session对象。

4b1c239653075c98b0b37d5228cdde1c.png

我们学习的时候有时会有一个误区,浏览器验证中session与cookie或者token到底有何关系呢,如下:

Session既然是为了标识一次会话,那么此次会话就应该有一个唯一的标识,这个标志就是sessionid。

每当一次请求到达服务器,如果开启了会话(访问了session),服务器第一步会查看是否从客户端回传一个名为JSESSIONID的cookie,如果没有则认为这是一次新的会话,会创建一个新的session对象,并用唯一的sessionid为此次会话做一个标识,如果有JESSIONID这个cookie回传,服务器则会根据JESSIONID这个值去查看是否含有id为JESSION值的session对象,如果没有则认为是一个新的会话,返回该session对象,数据达到共享。

这里提到一个叫做JESSIONID的cookie,这是一个比较特使的cookie,当用户请求到达服务器时,如果访问了sesion,则服务器会创建一个名为JESSIONID,值为获取到的session(无论时获取到的还是新创建的)sessionid的cookie对象,并添加到response对象中,响应给客户端,有效时间为关闭浏览器。

所以Session的底层依赖Cookie来实现。

5392bdcd75024a26ff760511f848c9e9.png

       如此可见,session与cookie并不是一种东西,但是我们建立会话时就会建立一个验证身份名为sessionid的cookie对象也就是jsession,来保障我们会话的安全。现在知道其实cookie对象的作用是很大的。
       而当我们的会话销毁时也就是关闭浏览器时,session就会自动销毁。

相关文章
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
358 0
|
4月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
4月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
64 0
|
6月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
278 1
|
5月前
|
存储 Java
Java对象的内存布局
在HotSpot虚拟机中,Java对象的内存布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含Mark Word、Class对象指针及数组长度;实例数据存储对象的实际字段内容;对齐填充用于确保对象大小为8字节的整数倍。
131 0
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
173 19
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
108 10
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
125 4
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。