会话怎么可以少了session和cookie

简介: 会话怎么可以少了session和cookie

1 cookie


26.png


众所周知,Web应用是使用大名鼎鼎的HTTP协议传输数据的。HTTP协议是无状态的协议,意味着一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,如果不采取一些措施的话,服务器将无法从连接上跟踪会话(你辛辛苦苦凑的单,说不定就躺在了别人的购物车里)。cookie就是这样的一种措施,将数据保存到客户端。抽象一点,cookie可以看作是服务器发给每一个客户的通行证,上面记录了你的一些个人信息,于是你去浏览网页的时候,网线的另一头就可以根据你的通行证知道你是谁了(突然害怕)。


专业一点的解释如图:

27.png


     服务器上部署了两个Servlet程序CookieDemo1.java和CookieDemo2.java,姑且简称为CD1和CD2吧,CD1程序中有发送cookie的代码,CD2程序中有获取cookie的代码,当你打开浏览器访问CD1之后,服务器就会将响应头中set-cookie字段通过键值对的形式进行设置,再次在浏览器中访问CD2时,请求头中cookie字段就会包含刚刚设置的cookie信息(实际上,不管你是否有获取cookie的代码,这里的请求头中都包含这一信息),于是乎服务器就可以知道你究竟是哪一位小朋友了~


Java中操作cookie很方便,主要有以下3个方法,了解java语法的小朋友靠猜都能知道:


创建cookie


new Cookie(String name, String value)


发送cookie


response.addCookie(Cookie cookie)


获取cookie


Cookie[] cookies = request.getCookies()


对于数组中的每一个cookie,getName,getValue等方法肯定会有的鸭


这里你可能就有疑问了,cookie究竟会保存多长时间?我说默认情况下浏览器关闭后就会被销毁,然而回忆一下平时我们网上冲浪的场景,在不登陆浏览器的情况下,我们对其所做的设置并不会因为明天重新来玩电脑打开网页时而消失不见,所以一种直觉就是cookie可以由程序写入电脑硬盘里而实现长久存储,事实也确实如此:


setMaxAge(int seconds)


对于程序员来讲,cookie的共享问题应该是最需要关心的了,假如在一个tomcat服务器中,部署了多个web项目,如果需要共享可以将 setPath(String path) 方法path设置为"/",当然为了安全考虑,默认情况下是不能共享的~。假如要使不同的tomcat服务器间共享cookie,那就必须调用 setDomain(String path) 方法设置一级域名相同啦,还是拿我最喜欢的百度来举例,百度贴吧tieba.baidu.com 和百度新闻news.baidu.com必定是部署在不同的服务器之上的,我们有 setDomain(".baidu.com") 来设置共享。


使用cookie的一个经典案例便是记住用户上一次访问的时间了,相信各位也会有意无意的注意到,尽管你不曾登陆过,有一些网页还是会提示上一次访问的时间,原理便也很简单,首次访问服务器时就会将cookie写回客户端保存,当你再次带着此物去访问时,服务器便可解析出相应的时间信息。公众号回复【cookie案例】即可获取此案例代码(仅供交流感情所用)。饼干虽小,足以果腹。


2 session


session可以用中文描述为:服务器端会话技术,在一次会话的多次请求间共享数据。和cookie对应,只不过是被保存在了服务器端的对象中,这个对象具体名字是HttpSession


实际上session的实现是依赖于cookie的,直接上图:

28.png


假设服务器中部署了两个Servlet程序,SessionDemo1.java和SessionDemo2.java,我们将其简称为SD1和SD2,两个程序中都有获取session的逻辑,当用户通过浏览器访问了SD1时,服务器并没有发现有session的存在,所以会在内存中创建一个新的Session对象并分配了一个编号,这里称做id,于是乎,创建一个cookie,并设置JSESSIONID等于先前分配的编号。这样一来一去的,在下一次请求时SD2时,程序就会获得这个session。


Java中使用HttpSession也很简单,经典的增删改差四君子如下:


查询:


Object getAttribute(String name)


增加:


void setAttribute(String name, Object value)


删除:


void removeAttribute(String name)


为什么没有修改呢。。。修改和增加其实一样啊


看到这里可能又有疑问了。。。我们该如何操作使得用户关闭浏览器重新打开后再次访问服务器,获得同一个session?我们已经说了,session是基于cookie实现的,cookie保存了session对象的身份证号码,它可以设置存活于内存中的时间呀!于是乎,思路顺势而生:


Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);


同样问题有两面,服务器重启前后两次获得的session也不是同一个,但是要确保数据不丢失。tomcat自动完成活化和钝化两个操作,钝化是指将session对象系列化到硬盘上,活化则是其相反过程,将session文件转化为内存中的对象,所以这里“不是同一个”的意思应该是两次获取的session内存地址是不同的。


之所以将其称之为主菜,那必然是拥有比cookie更高的热量更优秀的一些特性。cookie存储数据在客户端浏览器,这必然会导致一些安全性的担忧,同样,个人电脑和服务器的性能始终是不用比较的,所以浏览器对于单个cookie 的大小有限制(4kb)且对同一个域名下的总cookie数量也有限制(20个),因此,命名之争落下帷幕。


有了这个工具,我们就可以实现一些“更高级”的操作,比如验证码,不难分析,我们登录时经常输入的验证码肯定是电脑自动生成的(如果是在服务器里存储成千上万张验证码的图片未免太过低级,并且浪费资源),这里就需要借助session在不同的服务器程序中共享数据来获得生成的验证码,如下:

29.png


相关文章
|
21天前
|
存储 安全
Cookie会话跟踪的原理
会话跟踪技术包括Cookie和Session。Cookie是客户端技术,首次访问时服务器通过Set-Cookie响应头发送Cookie,浏览器保存并在后续请求中通过Cookie请求头回传,实现会话跟踪。但Cookie易被用户修改或禁用,安全性较低。Session则是服务器端技术,每次会话生成唯一的Session ID,通过Cookie传递给客户端,客户端在后续请求中携带此ID,服务器据此识别会话。Session更安全,但在集群环境中需解决会话共享问题。
38 1
|
1月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
72 4
|
1月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
2月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
209 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
2月前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
32 1
|
3月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
3月前
|
存储 安全 NoSQL
Cookie、Session、Token 解析
Cookie、Session、Token 解析
71 0
|
3月前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
4月前
|
存储 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
294 1
|
4月前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
83 1