Session和Cokkie对象的基本使用
关于B/S结构系统的会话机制(Session)
概念
什么是会话?
- 用户打开浏览器,进行一系列操作,最后将浏览器关闭,整个过程叫做一次会话,会话在服务端也有一个Java对象,这个Java对象叫做:Session
- 一个会话中包含多次请求
- 在Java的Servlet规范中,session对应的类名:HttpSession
- session机制属于B/S结构的一部分,如果使用其他语言开发web项目,同样也是session这种机制。session机制实际上是规范,不同语言对这种回话机制都有实现
- session对象的最主要的作用是:保存会话状态(假设用户登陆成功后,使用session对象可以保留会话状态)
为什么需要session对象来保存会话状态?
- 因为http协议是一种无状态协议
- 无状态:请求的时候,B/S是连接的,但是请求结束后,连接就断了,这种无状态的协议,可以降低服务器的压力,请求结束后,连接断开,服务器压力小
- 只要B/S断开,那么关闭浏览器这个动作,浏览器无法识别
为什么不使用request对象保存会话状态?为什么不使用ServletContext对象保存会话状态?
request.setAttribute()存,request.getAttribute()取,request是请求域。ServletContext
是应用域request是一次请求一个对象
ServletContext对象是服务器启动的时候创建,服务器关闭的时候销毁,这个ServletContext对象只有一个
ServletContext域对象太大
request请求域、session会话域、application域(ServletContext)
request<session<application
session对象是存储在服务端的
一个session对象对应一个会话
一次会话中包含多次请求
获取方式
HttpSession session = request.getSession(); /** 从服务器中获取到对应的session对象 如果没有获取到对应的session对象,则新建 */ HttpSession session = request.getSession(false); //从服务器中获取不到session,则不会新建,返回一个null /** 为什么关闭浏览器之后,会话结束? 关闭浏览器之后,浏览器中保存的sessionid消失,下次重新打开浏览器之后,浏览器缓存中没有这个sessionid,自然找不到服务器中对应的session对象,session对象找不到等同于会话结束 */
session实现原理
在web服务器中有一个session列表,类似于map集合,在这个map集合的key存储的是sessionid 在这个map集合中value存储的是对应的session对象
用户第一次发送请求的时候,服务器会创建一个新的session对象,同时给session对象生成一个id,然后web服务器将会将session的id发送给浏览器,浏览器将session的id保存到浏览器的缓存中
用户第二次发送请求的时候,会自动将浏览器缓存中的sessionid自动发送给服务器,服务器获取到sessionid自动发送给服务器,然后从session列表中查找到对应session对象
<!--session的超时时长是30分钟--> <!--如果三十分钟过去了,session对象仍然没有被访问,session对象会被销毁--> <!--如果不设置,默认值是三十分钟--> <session-config> <session-timeout>30</session-timeout> </session-config>
关闭浏览器,内存消失,cookie消失sessionid消失
- 为什么关闭浏览器之后,会话结束?
关闭浏览器之后,浏览器中保存的sessionid消失,下次重新打开浏览器之后,浏览器缓存中没有这个sessionid,自然找不到服务器中对应的session对象,session对象找不到等同于会话结束
- session对象什么时候被销毁
一种销毁:是超时销毁
一种销毁:是手动销毁
- cookie禁用了,session还能找到吗?
cookie禁用是什么意思?服务器正常发送cookie给浏览器,但是浏览器不要拒收,并不是浏览器不发,session对象找不到,每一次请求都会生成新的cookie对象
- cookie禁用了,session机制还可以实现嘛?
可以,需要使用URL重写机制
http://localhost:8080/sevelet/servlet;jsessionid=xxxxxxxxx
url重写机制会提高开发者的成本,开发人员在编写任何请求路径的时候,后面都要添加一个sessionid,给开发人员带来了很大的难度,很高的成本,所以大部分网站都是这样设计的:你要是禁用cookie,你就别用了
销毁session对象
session.invalidate();
总结
request(对应的类名:HttpServletRequest) 请求域(请求级别的)
session(对应的类名:HttpSession) 会话域 (用户级别的)
application(对应的类名:ServletContext) 应用域(项目级别的,所有用户共享)
三个域对象都有以下三个方法
setAttribute(向域当中绑定数据)
getAttribute(从域中获取数据)
removeAttribute(删除域中的数据)
Cokkie
概念
Cookie,有时也用其复数形式Cookies,类型为“小型文本文件”,是为了某些网站辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息
为什么要使用Cokkie?解决了什么问题?
web程序是使用HTTP协议传输的,而HTTP协议是无状态的协议,对于事物处理没有记忆功能,缺少状态意味着如果后续处理需要前面的信息,则必须重新传输,这样可能导致每次连接的传输的数据量增大,另一方面,在服务器不需要先前信息时他的应答更快。
- Cookie的出现就是为了解决这个问题
第一次登陆后,服务器返回一些数据(Cookie)给浏览器,然后浏览器保存到本地,当该用户发送第二次请求的时候,就会自动的把上次请求的Cookie数据自动的携带给服务器,服务器通过携带的数据就可以进行对用户的判断
- 特点
cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4kB,因此Cookie只能存储一些小量的数据
Cookie什么时候产生的?
- Cookie的使用一先要看需求。因为浏览器可以禁用Cookie,同时服务端也可以不Set-Cookie。
- 客户端向服务器端发送一个请求的时,服务端向客户端发送一个Cookie然后浏览器将Cookie保存
- Cookie有两种保存方式,一种是浏览器会将Cookie保存在内存中,还有一种是保存在客户端的硬盘中,之后每次HTTP请求浏览器都会将Cookie发送给服务器端。
Cookie的生命周期
//创建一个Cookie 此时的Cookie存储在jvm中 Cookie cookie =new Cookie("key","value"); //将Cookie添加到HttpResponse对象中,然后Cokkie就可以保存到浏览器了 reponse.addCookie(cookie); //设置cookie的存活时间 cookie.setMaxAge(60*60);//一小时 /** *当Cookie设置成0或者负数时,则表示在关闭浏览器后马上删除,不会保存用户数据,更加安全 * cookie.setMaxAge(0); * cookie.setMaxAge(-60); */
Cookie关联的路径
当手动设置Cookie的path后
cookie.setPath("/xxx") //表示只要是"xxx"的路径下的项目,其Cookie都相同
Cookie有哪些缺陷
- 数量受到限制,一个浏览器能创建的Cookie数量最多为300,每个最多为4KB,每个WEB站点设置的cookie总数不能超过20个
- 安全性无法得到保障,通常跨站点脚本攻击往往利用网站漏洞在网站页面中植入脚本代码或网站页面引用第三方法脚本代码,均存在跨站点脚本攻击的可能,在受到跨站点脚本攻击时,脚本指令将会读取当前站点的所有Cookie 内容
- 浏览器可以禁用Cookie,禁用Cookie后,就无法享用Cookie带来的限制
Cookie于Session的相同点和不同点
共同之处
Cookie和Session都是用来跟踪浏览器用户身份的会话方式
不同点
cookie数据保存在客户端,session数据保存在服务端
session简单的说,当你登陆一个网站的时候,如果浏览器使用的是session,那么所有的数据保存在服务器上,客户端每次请求服务器的时候会发送当前会话sessionid ,服务器根据当前sessionid判断相应的用户数据标志,用来确定用户是否登陆或具有某种权限,由于数据存储在服务器上面,所以不能伪造
cookie,sessionid是服务器和客户端连接的时候随机分配的,如果浏览器使用的是cookie那么所有的数据都保存在浏览器端,比如你登陆以上,服务器设置了cookie用户名,那么当你再次请求服务器的时候,浏览器会将用户名一块发送给服务器,这些变量有一定的特殊标记,服务器会解释为从cookie变量,所以只要不关闭浏览器,那么cookie变量一直是有效的,所以可以保证长时间不掉线
如果你能截取某个用户的cookie变量,然后伪造一个数据包发过去,那么服务器还是认为合法的,所以,有可能会被攻击
如果cookie设置了有效值,那么cookie会保存到客户端的硬盘上,下次在访问网站的时候,浏览器会检查有没有cookie,如果有的话,读取cookie,然后发送给服务器
所以你在机器上面保存了某个论坛cookie,有效期是一年,如果有人入侵你的机器,将你的cookie拷走,放在他机器下面,那么他登陆该网站的时候就是用你的身份登陆的。当然,伪造的时候需要注意,直接copy cookie文件到 cookie目录,浏览器是不认的,他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器
两个都可以用来存私密的东西,session过期与否,取决于服务器的设定。cookie过期与否,可以在cookie生成的时候设置进去。
区别对比
标签:浏览器,对象,session,cookie,Seesion,服务器,Cokkie,Cookie From: https://www.cnblogs.com/xiaoxu137/p/17127341.html
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- cookie不是很安全,别人可以分析存放在本地的Cookie进行Cookie欺骗,如果主要考虑安全则应使用session
- session会在一定时间内保存在服务器,当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用Cookie
- 单个cookie在客户端的限制是3k,就是说一个站点在客户端存放的cookie不能超过3k
- 所以,将登录信息的重要信息存放为session,其他信息需要保留,可以放在cookie中