会话跟踪技术
一:会话跟踪技术
会话跟踪是 WEB 中常用的技术,用来跟踪用户的整个会话,常用的会话跟踪技术有Cookie和Session,Cookie是在客户端记录信息确定用户身份,Session是在服务端记录信息确定用户身份。
会话:用户打开浏览器,访问服务器web资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
为什么需要会话跟踪技术:HTTP协议是无状态的,每次浏览器向服务器发请求的时候,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享。
二:Cookie
Cookie是由W3C组织提出,最早由Netscape社区发展的一种机制。
由于HTTP协议是无状态协议,服务器单从网络连接上无法知道客户身份,所以就需要给客户端一个通信证,这样服务器就能根据通信证确认客户的身份了,所以无论谁访问都必须携带通行证。知道了Cookie的工作原理,我们就来说一说Cookie的工作流程。当服务器发送一条请求到达 Servlet时,Servlet里面会创建一个Cookie对象数据,当Servlet将响应数据返回给客户端的时候也会将Cookie数据发送到用户浏览器中进行保存,以后每次请求都携带Cookie数据进行访问。
发送和获取Cookie
发送Cookie
//创建Cookie对象,设置数据 Cookie cookie = new Cookie("key","value"); 发送Cookie到客户端,使用response对象 response.addCookie(cookie);
获取Cookie
//获取客户端携带的所有Cookie,使用request对象 Cookie[] cookies = request.getCookies(); //遍历数组,获取每一个Cookie对象 for(Cookie cookie :cookies){ //使用Cookie对象方法获取数据 cookie.getName(); cookie.getValue(); }
需要注意的是,Cookie具有不可跨域名性,什么意思呢。比如我们使用Google浏览器进行访问,请求中只会携带Google的Cookie,而不会携带百度浏览器的Cookie,Google只能操作Google的Cookie,而百度也只能操作百度的Cookie。从而保证了用户的隐私安全。因为浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。
中文编码
在Cookie中,是无法保存中文的,中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。
需要进行URL解码
URLDecoder.decode(cookie.getValue(),"UTF-8")
设置Cookie的有效期
// 新建Cookie Cookie cookie = new Cookie("username","hello"); // 设置生命周期为MAX_VALUE cookie.setMaxAge(Integer.MAX_VALUE); // 输出到客户端 response.addCookie(cookie);
maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。
maxAge属性为负数,则表示该Cookie在当前浏览器内存中,当关闭浏览器,则Cookie被销毁。
maxAge属性为零:删除对应的Cookie。
修改
由于Cookie不提供修改、删除操作。当想要修改某个Cookie时,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。
安全属性
HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输很机密的内容是一种隐患。如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。下面的代码设置secure属性为true:
// 新建Cookie Cookie cookie = new Cookie("lisi", "123456"); // 设置安全属性 cookie.setSecure(true); // 输出到客户端 response.addCookie(cookie);
secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。
三:Session
Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
如果说Cookie机制是通过检查客户身上的通行证来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
知道了原理,那么来看看Session的执行流程:Session对象是在客户端第一次请求服务器的时候创建的。
使用Session时,不同的客户端只会获取到自己的Session,而不会获取到别人的Session,各个客户的Session彼此独立,互不可见。
获取和存储
Session对应的类为javax.servlet.http.HttpSession类。
//1.获取Session对象 HttpSession session = request.getSession(); 2.存储数据 session.setAttribut("name","lisi");
为了获得更高得存取速度,服务器一般将Session是保存在内存当中的,但是每个客户都有一个独立的Session,如果Session的信息很复杂的话,当大量客户访问服务器时可能导致内存溢出,因此Session的信息应该尽量精简。
设置有效期
为防止用户数量越来越多,造成内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。
修改Session的超时时间 session.setMaxInactiveInterval(longinterval);
Sessio实现
Session 是基于Cookie实现的。
HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为session的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值),Session依据该Cookie来识别是否为同一用户。
注意:该Cookie仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。
四:Cookie与Session的区别
1.cookie数据存放在客户的浏览器上,session数据放在服务器上。
2.cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗考虑到安全应当使用session。
3.设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
4.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
5.单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型,但是服务器压力会增大。
最大的区别在于两者的生命周期,Seesion生命周期是从浏览器启动到关闭,浏览器关闭Session就消失。Cookie是预先设置生命周期,或永久的保存于本地的文件。
本文作者:爱慕6
本文链接:https://www.cnblogs.com/aimu69/p/16006725.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步