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就会自动销毁。

相关文章
|
6天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
20 9
Java——类与对象(继承和多态)
|
6天前
|
SQL Java 编译器
Java——类与对象(封装)
封装是面向对象编程中的概念,指将数据(属性)和相关操作(方法)组合成独立单元(类),使外部无法直接访问对象的内部状态,只能通过提供的方法进行交互,从而保护数据安全。例如,手机将各种组件封装起来,只暴露必要的接口供外部使用。实现封装时,使用`private`关键字修饰成员变量,并提供`get`和`set`方法进行访问和修改。此外,介绍了包的概念、导入包的方式及其注意事项,以及`static`关键字的使用,包括静态变量和方法的初始化与代码块的加载顺序。
18 10
Java——类与对象(封装)
|
6天前
|
Java C语言
Java——类与对象
这段内容介绍了Java中的类和对象、`this`关键字及构造方法的基本概念。类是对现实世界事物的抽象描述,包含属性和方法;对象是类的实例,通过`new`关键字创建。`this`关键字用于区分成员变量和局部变量,构造方法用于初始化对象。此外,还介绍了标准JavaBean的要求和生成方法。
18 9
Java——类与对象
|
3天前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
34 18
|
7天前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
|
1天前
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
38 4
|
1天前
|
SQL Java 关系型数据库
在Java中,创建数据源对象
在Java中,创建数据源对象
7 1
|
7天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第12天】在Java的世界里,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何通过实现Serializable接口来标记一个类的对象可以被序列化,并探索ObjectOutputStream和ObjectInputStream类的使用,以实现对象的写入和读取。我们还将讨论序列化过程中可能遇到的问题及其解决方案,确保你能够高效、安全地处理对象序列化。
|
7天前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
25天前
|
存储 JavaScript 前端开发
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
42 1