一、问世环境
HTTP是无状态的,即服务器没法了解2个请求是不是来源于同一个电脑浏览器,其实就是服务器不清楚用户上一次干了什么,每一次请求全是彻底单独的。
初期互联网技术仅仅用以简单访问文本文档信息、查询企业黄页和门户网等,并没互动这一概念。可是移动互联网渐渐地发展趋势,宽带网络、服务器等硬件条件获得了不少的提高,互联网技术容许大家做更多的事,因此互动式Web(互动式Web即手机客户端与服务器能够互动交流,如用户登陆、产品选购和论谈等)慢慢就掀起了,而HTTP无状态的特征对于此事导致了比较严重阻拦。
因为不可以纪录用户上次的实际操作,伟大程序猿创造了隐藏域用以纪录用户上一次操作信息;根据隐藏域把用户之前操作记录放到form表单的cnput中,那样请求时把提交表单就能知道上一次用户操作了,但这样总是得建立隐藏域且需要取值,既不便也容易出差错;可是隐藏域功效强劲,时迄今日都是有不少人在用来处理一些问题。隐藏域的书写格式如下所示:
<input type=\"hidden\" name=\"field_name\" value=\"value\">
网景公司的卢-蒙特利Lou Montulli,在1994年将Cookies的定义用于通信网络,用以处理用户网络购物的加入购物车历史数据,而且当时最厉害的电脑浏览器都是网景浏览器;随后在网景浏览器的大力支持下其他浏览器也开始逐渐适用Cookie,至今所有浏览器也支持Cookie了。
二、什么叫Cookie
Cookie的问世就是为了处理HTTP无状态的特点,用以达到互动式Web。
图1. Chrome浏览器百度主页Cookies
图2. Firefox浏览器百度主页Cookie
图3. Safari浏览器百度主页Cookie
图中中可以看出在Chrome、Firefox和Safari浏览器中百度主页的Cookie,在表中,每一行都代表了一个Cookie。Cookie是由服务器发送给手机客户端特殊的信息,但这些信息以文本文档的方式储存在手机客户端,随后手机客户端每一次向服务器推送请求时都会携带这种特殊信息,用以服务器纪录手机客户端状态。
Cookie关键应用于下列三个方面:
1、对话状态管理,如用户登录状态、加入购物车、手机游戏成绩或其它必须的记录信息;
2、个性设置,如用户自定设定、主题风格等;
3、电脑浏览器个人行为追踪。
三、Cookie基本原理
Cookie是由服务器传出储存用浏览器特殊的信息,其具体全过程能通过一个用户登陆的事例去了解。
图4. Cookie工作原理
以上如图所示,用户在键入用户名与登陆密码以后,电脑浏览器将用户名与密码发送给服务器,服务器开展认证,验证成功之后将用户信息数据加密后打包封装成Cookie放到请求头中返还给电脑浏览器。
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Aug 2019 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly
[响应体]
电脑浏览器接到服务器返回数据信息,发觉请求头中有一个:Set-Cookie,随后它就把这个Cookie保攒起来,下一次电脑浏览器再请求服务器时,能把Cookie也一起放到请求头中发送给服务器。
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg
服务器接到请求后往请求头中取得Cookie,随后分析并获得用户信息,表明此用户已登录,因而Cookie是将数据保存在服务端的。
从以上用户登陆的事例能够得知,用户信息是储存在Cookie中,可能就就相当于储存用浏览器里的,那样用户就可以任意变更用户信息,这是一种不安全的对策。此外,Cookie不论是服务器发给电脑浏览器,或是电脑浏览器发给服务器,全是放到请求头里的。
四、Cookie特性
从上图的Chorme、Firefox和Safari浏览器能够看见一个Cookie有:Name、Value、Domian、Path、Expires/Max-Age、Size、Http(Httponly)和Secure这种特性。
1、Name & Value
Name表示Cookie的名字,服务器就是利用name特性来获得某一Cookie的值。
Value表示Cookie的值,大多数情况下服务器会把那个value当做一个Key去缓存文件中查看储存的信息。
2、Domain & Path
Domian表示能够浏览此Cookie的网站域名,下面的图就以百度贴吧首页的Cookie来了解一下Domain的特性。
图5. Chrome浏览器贴吧首页Cookie’s Domain
图中可以看到,第三列的Domian有:.baidu.com顶级网站域名和.teiba.baidu.com二级域名;所以在这里就有一个浏览标准:一级域名只有设定或浏览一级域名的Cookie,二级以内的网站域名只有浏览或设定本身或是一级域名的Cookie,因此如果想在各个二级域名中分享Cookie的话,只能把Domain的特性设为一级域名。
Path表示能够浏览此Cookie的网页页面途径;如path=/test,那样仅有/test途径下页面能够载入此Cookie。
3、Expire/Max-Age
Expire/Max-Age表示此cookie的超时时间;若设定其值为一个时长,因此当抵达此时间时,此cookie往往会无效;不设得话初始值是Session,含意是cookie会和session一起无效;当浏览器关闭(关掉全部电脑浏览器,而非浏览器标签页)后,此cookie无效。此外,当Cookie的过期时间被设置时,设置的日期与时间只与手机客户端有关,与服务器端不相干。
4、Size
Size表示Cookie的name value的字符数,例如有一个Cookie:id=666,那样Size=2 3=5。2即是name,3即是value,每个电脑浏览器对Cookie的适用都不尽相同,如下图所示:
图6. 各电脑浏览器Cookie鼓励的数量
5、HTTP
HTTP表明cookie的httponly特性;如此特性为true,则只会在http请求头时会含有此cookie的信息,而无法通过document.cookie来浏览此cookie。那么设计方案就是为了提供一个安全防范措施来协助阻拦根据JavaScript发起xss漏洞(XXS)盗取cookie的恶劣行为。
图7. document.cookie
6、Secure
Secure表示是不是只能依靠https来传送此条cookie;不像别的选择项,该选择项只是一个标识而且没有其它的值。
五、Java操作Cookie
1、形成Cookie
1 package com.ausclouds.bdbsec.auth.cmb;
2
3 import javax.servlet.http.Cookie;
4 import javax.servlet.http.HttpServlet;
5 import javax.servlet.http.HttpServletRequest;
6 import javax.servlet.http.HttpServletResponse;
7
8 public class CookieServlet extends HttpServlet {
9
10 @Override
11 protected void service(HttpServletRequest req, HttpServletResponse resp){
12 //建立Cookie目标
13 Cookie comCookie = new Cookie(\"computer\", \"HP\");
14 //网络服务器把cookie响应给手机客户端,全部的cookie目标,都要在服务端建立,根据http响应给手机客户端(电脑浏览器)
15
16 //如果不设定使用时间,则取不上Cookie的值
17 comCookie.setMaxAge(60*60*24*30);
18
19 //一旦设定了cookie的途径,就只能依靠这一个途径才可以获取到cookie的信息
20 comCookie.setPath(req.getContextPath() \"/getCookie.sxt\");
21
22 //加上cookie
23 resp.addCookie(comCookie);
24
25 }
26 }
2、获取Cookie
1 package com.ausclouds.bdbsec.auth.cmb;
2
3 import javax.servlet.http.Cookie;
4 import javax.servlet.http.HttpServlet;
5 import javax.servlet.http.HttpServletRequest;
6 import javax.servlet.http.HttpServletResponse;
7
8 public class GetCookieServlet extends HttpServlet {
9
10 @Override
11 protected void service(HttpServletRequest req, HttpServletResponse resp){
12 //获取cookie信息
13 Cookie[] cookies = req.getCookies();
14 for (int i = 0; i<cookies.length; i ){
15 System.out.println(cookies[i].getName() \":\" cookies[i].getValue());
16 }
17 }
18
19 }
3、删掉Cookie
//删掉Cookie的构思便是更换原先的cookie,并设定它预期寿命为0
Cookie cookie = new Cookie(\"Cookie\",null);//cookie名称要同样
cookie.setMaxAge(0); //
cookie.setPath(request.getContextPath()); // 同样途径
response.addCookie(cookie);
六、Session
1、问世环境
实际上设计方案Cookie之时,它不是只是收藏了一个key值,而是通过储存客户的信息,但由于cookie是存有手机客户端的,并且自身储存的尺寸比例也非常有限,最主要的是客户是可见的,而且可以任意地改动,这相当地不安全的。为了能既轻松又方便快捷的载入全局性信息,因此出现了Session这类一个新的储存对话体制。
2、什么叫Session
Session翻译为对话,网络服务器为每一个电脑浏览器创建一个对话目标,电脑浏览器在第一次要求远程服务器,网络服务器就会为该电脑浏览器形成一个Seesion目标,储存在服务器端,并把Session的Id以cookie的方式发给手机客户端电脑浏览器,最后以用户表明完毕或session超中为完毕。
Session工作中原理:
1.当某一客户向服务器发送第一个要求时,网络服务器向其创建一个sesion,并为此session创建一个标识号(sessionID);
2.这一客户接着的所有要求都应该包含这一标识号(sessionID),网络服务器会审校这一标识号以分辨要求属于哪一个session的;
3.sessionID标识号主要有两种控制方式:Cookie和URL重新写过;
4.Cookie是将数据立即储存在手机客户端,而Session是将数据保存在服务器端,因此Session的安全系数更好。
图8. Session工作中原理(根据Cookie完成)
3、Java操作Session
1.建立Session
ActionContext actionContext = ActionContext.getContext();
Map<String, Object> mapSession = actionContext.getSession();
mapSession.put(\"branch\", branch);
mapSession.put(\"permission\", per);
2.JSP获取Session
1 if(session.getAttribute(\"branch\") == null||session.getAttribute(\"permission\") == null)
2 {
3 response.setCharacterEncoding(\"utf-8\");
4 out.print(\"<script>alert(\'您都还没登陆,请登录\') </script>\");
5 out.flush();
6 out.close();
7 }
3.Java后台获取Session
1 ActionContext actionContext = ActionContext.getContext();
2 Map session = actionContext.getSession();
3 String inputUserid =(String)session.get(\"username\");
4 String proving =(String)session.get(\"proving\");
七、招聘面试有关
1、Cookie和Session的关联?
1. 二者都是为完成手机客户端与服务器端互动而提供服务的;
2. Cookie是储存在手机客户端,缺陷易仿冒、不安全的;
3. Session是储存在服务器端,会损耗服务器空间;
4. Session完成主要有两种方式:Cookie和URL重新写过。
2、Cookie带来安全性难题?
1. 对话挟持和XSS:在Web应用中,Cookie常用于标识客户或受权对话。因而,假如Web应使用的Cookie被盗取,可能造成受权客户的对话受到伤害;常见的盗取Cookie的方法有网络钓鱼进攻与应用程序漏洞开展XSS进攻;
2. 跨站恳求仿冒(CSRF):wiki百科早已提出了一个比较好的CSRF事例。当在不安全的在线聊天室或社区论坛里的一张图片,它其实是一个让你金融机构服务器发送取现的请求:
<img src=\"http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory\">
如果你点击显示该照片时,如果已经早已登陆过你的银行账户而且Cookie并未无效,那么我金融机构上的钱很有可能会被自动转走;处理CSRF的方法有:掩藏域短信验证码、确定机制和设定比较短的Cookie生命期等。
3、Session应用领域?
Session通常是服务端储存,用于叙述一些客户信息或是有关的许多数据信息,也可以是其他类型数据信息,只要是自己的项目觉得可以关联到客户或手机客户端的统计数据都能够放进session中;最基本情景便是储存登陆客户信息。
4、Session生命期?
1、建立:若浏览的第一个网络资源是JSP网页页面,则创建session目标;若浏览的第一个网络资源是Servlet,就需要手动式调用request.getSession()方式来创建session目标;
2、消毁:调用session.invalidate()方式来消毁session()目标,session会话超时默认设置30min。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。