阅读本文大约需要3分钟,文章内容来自网络和书籍总结,内容清晰详尽,欢迎评论、收藏!
1.Cookie
1.1cookie 技术
-
cookie技术是将用户的数据存储到浏览器客户端的技术
-
服务器如何将cookie发送到客户端
Cookie cookie = new Cookie("lastTime", str_loginTime); cookie.setMaxAge(60 * 60 *24 *30); // one Month;Cookie在客户端持久化的时间 cookie.setPath(String path); //设置Cookie的携带路径,访问path路径时,客户端才会携带上该cookie response.addCookie(cookie); //向客户端发送cookie
1.如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭,cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里
2.cookie.setPath(String path);如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
3.如何删除某cookie,使用同名同路径的持久化时间为0的cookie进行覆盖即可
-
服务器如何接收客户端携带的Cookie
- cookie信息是以请求头的方式发送到服务器端的:
//1.通过request获取所有的cookie Cookie[] cookies = request.getCookies(); //2.遍历Cookie数组 for(Cookie c:cookies){ }
1.2Cookie的工作流程/原理
1.客户端访问服务器,服务器调用新建一个Cookie对象,response.addCookie(cookie)方法,
2.产生响应时,会产生set-cookie响应头,将cookie文本发送给客户端,客户端会将cookie文本保存起来,
3.当客户端再次请求服务器时,会产生cookie请求头,将之前服务器发送的cookie信息,再发送给服务器,服务器就可以根据cookie信息跟踪客户端的状态。
1.3Cookie的分类
- 会话级cookie:存放在客户端浏览器的缓存中,当浏览器不关闭,cookie信息一直存在,浏览器一关闭,cookie消失
- 持久化cookie: 存放在客户端的磁盘文件中,并可以设置cookie过期时间,过期时间之内,即使浏览器关闭,也可以将cookie信息发送给服务器,超过过期时间,cookie消失。
1.4Cookie的特点和作用
Cookie的特点:
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
作用:
1. cookie一般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
例子:记住上一次访问时间
1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
3. 注意cookie中存中文字段时,请先编码,后解码使用
str_date = URLEncoder.encode(str_date,"utf-8");
value = URLDecoder.decode(value,"utf-8");
2.Session
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
- 会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内 存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID
2.1 获取客户端的Session对象
HttpSession session = req.getSession(); //1.获取HttpSession对象
session.setAttribute("checkCode","1234"); //2.session对象的数据存取
Object checkCode = session.getAttribute("checkCode");
session.removeAttribute("checkCode");
2.2 Session对象的生命周期(面试)
创建:第一次执行request.getSession()时创建
销毁:1)服务器(非正常)关闭时
2)session过期/失效(默认30分钟)-->距离上次点击网站,间隔30分钟
作用范围: 默认在一次会话中,任何资源公用一个session对象
2.3浏览器关闭了,Session就销毁了吗?
当用户关闭了浏览器虽然session cookie(JSESSIONID)已经消失,但session对象仍然保存在服务器端.
- 是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。
2.4Session的工作原理
-
网页间跳转的额外数据,保存在服务器,用一个id标识,浏览器要维持session,需要每次提交都带上这个id.
-
session 使用过期时间设为0的cookie,并且将一个称为session ID的唯一标识符(一长串字符串),在服务器端同步生成一些 session文件(可以自己定义 session的保存类型),与用户机关联起来。
-
web应用程序存贮与这些 session 相关的数据,并且让数据随着用户在页面之间传递.访问网站的来客会被分配一个唯一的标识符,即所谓的 SESSION ID。
2.5 Session是如何保存和调用的
-
保存:session是以文件的形式保存的,命名格式是:
sess_[PHPSESSID的值]
-
调用:session.save_path路径下记录了不同浏览器,不同用户的session文件,是依据用户请求头中cookie的JSESSIONID来确定的。
3.Cookie和Session的比较
3.1Cookie和Session的原理以及区别
- 原理:
1.cookie采用的是客户端的会话状态的一种储存机制。它是服务器在本地机器上存储的小段文本或者是内存中的一段数据,并随每一个请求发送至同一个服务器。
2. session是一种服务器端的信息管理机制,它把这些文件信息以文件的形式存放在服务器的硬盘空间上(这是默认情况,可以用memcache把这种数据放到内存里面)当客户端向服务器发出请求时,要求服务器端产生一个session时,服务器端会先检查一下,客户端的cookie里面有没有session_id,是否过期。如果有这样的session_id的话,服务器端会根据cookie里的session_id把服务器的session检索出来。如果没有这样的session_id的话,服务器端会重新建立一个。JSESSIONID是一串加了密的字符串,它的生成按照一定的规则来执行。同一客户端启动二次session_start的话,session_id是不一样的。
- 区别:
①存在的位置:
cookie 存在于客户端,临时文件夹中; session存在于服务器的内存中,一个session域对象为一个用户浏览器服务
②安全性
cookie是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放; session存放于服务器的内存中,所以安全性好
③网络传输量
cookie会传递消息给服务器; session本身存放于服务器,不会有传送流量
④生命周期(以20分钟为例)
cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束;
session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁。但是,如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期。关机会造成session生命周期的结束,但是对cookie没有影响
⑤访问范围
cookie为多个用户浏览器共享; session为一个用户浏览器独享
3.2 如果用户把cookie禁止掉,session也不能用了吗?
- 关键在于服务器获取到JSessionId的方式:(1)请求头中,通过cookie传递 (2)URL后提交 (3)表单形式提交
- session产生的session_id放在cookie里面,禁止掉cookie后,session还可以用,不过通过其他的方式来获得这个sessionid,比如,可以跟在url的后面,或者以表单的形势提交到服务器端。从而使服务器端了解客户端的状态。
3.3为什么说Session比Cookie更加安全
-
session的sessionID是放在cookie里,要想功破session的话,得分两步:
-
第一:要得到sessionID。攻破cookie后,要得到sessionID, sessionID是要有人登录,或者启动session_start才会有,但不知道什么时候会有人登录。
-
第二:取有效sessionID。sessionID是加密的,第二次session_start的时候,前一次的sessionID就没有用了,session过期时sessionid也会失效,想在短时间内功破加了密的 sessionID很难。session是针对某一次通信而言,会话结束session也就随着消失了。
(使session失效的方法:1.关闭tomcat 2.重启web应用 3.session时间到 4.无效的session)