
首先,出生支持者
HTTP是无状态的,即服务器无法知道两个请求是否来自同一个浏览器,也就是服务器不知道用户上次做了什么,每个请求都是完全独立的。
在早期,互联网只是用于简单的浏览文档信息,查看黄页和门户网站,并没有与这种视图的交互。但是随着互联网的逐渐壮大,宽带、服务器等硬件设施已经完善了很多,互联网让人们可以做更多的事情,于是交互式Web(即客户端和服务器可以进行交互,比如用户登录、商品购买和论坛)逐渐出现,HTTP的无状态特性已经严重阻碍了这一点。
因为不能记录用户最后的操作,所以伟大的程序员明确表示,隐藏字段是用来记录用户最后的操作信息的;通过隐藏字段把用户的最后一次操作记录放到表单的输入中,这样在请求的时候提交表单的时候就可以知道用户的最后一次操作了。但是,每次建立隐藏字段和赋值都很差,容易出错。然而,隐藏域的作用越来越大,今天许多人都在用它来解决各种问题。隐藏域的写法如下:
lt;input type=”hidden” name=”field_name” value=”value”gt;
网景公司的Lou Montulli在1994年将Cookies的概念应用到网络通信中,解决用户网购的购物车历史,当时最强大的浏览器是网景浏览器。后来在网景浏览器的支持下,其他浏览器逐渐先支持cookie,现在所有浏览器都支持cookie。
其次,什么是Cookie
Cookie的诞生是为了理解HTTP的无状态特性,满足Web的交互性。
图一。Chrome浏览器百度home cookie
图2。火狐浏览器百度home Cookie
图3。Safari浏览器百度主页Cookie
你可以在Chrome、Firefox、Safari中看到百度首页的Cookies。在表格中,每一行代表一个cookie。Cookie是服务器发送给客户端的特殊信息,这些信息以文本文件的形式存储在客户端,然后客户端每次向服务器发送请求时都会带着这些特殊信息,这样服务器就可以记录客户端的状态。
Cookie主要用于以下三个方面:
1.会话状态管理,如用户登录状态、购物车、游戏比分或其他需要记录的信息;
2.个性化设置,如用户自定义设置和主题;
3.浏览器行为跟踪。
三。Cookie原则
Cookie是由服务器发送并存储在浏览器中的特殊信息。其详细过程可以通过一个用户登录的例子来了解。
图4。Cookie原则
如上图所示,用户输入用户名和密码后,浏览器将用户名和密码发送给服务器,服务器进行验证。验证之后,用户信息被加密并打包到一个Cookie中,然后在请求头中返回给浏览器。
HTTP/1.1 200 OKContent-type: text/htmlSet-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.1Host: www.example.orgCookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg
服务器收到请求后,从请求头中获取Cookie,然后分析获取用户信息,表示用户已经登录,所以Cookie把数据保存在客户端。
从上面用户登录的例子可以看出,用户信息保存在Cookie中,相当于保存在浏览器中,所以用户可以随意更改用户信息,这是一种不安全的策略。此外,无论是服务器将Cookie发送给浏览器,还是浏览器将它们发送给服务器,Cookie都被放在请求头中。
四。Cookie属性
从上面展示的Chorme、Firefox和Safari的浏览器中,我们可以看到一个Cookie有以下属性:Name、Value、Domian、Path、Expires/Max-Age、Size、Http(Httponly)和Secure。
1、名称和值
Name表示Cookie的名称,服务器通过name属性获取Cookie的值。
Value表示Cookie的值。在大多数情况下,服务器将使用该值作为查询缓存中保留数据的键。
2、域和路径
Domian表示您可以接收此Cookie的域名。下面我们用百度贴吧首页的Cookie来了解一下domain的属性。
图5。Chrome浏览器贴吧主页Cookie的域
从图中可以看出,第三列的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表示Cookie的名称+值的字符数,就好比有一个cookie: ID = 666,那么Size=2+3=5。2是名称,3是值。不同的浏览器对Cookie的支持不同,如下图:
图6。每个浏览器支持的Cookie数量
5、HTTP
HTTP信号cookie的Httponly属性;如果该属性为真,则http请求头中将只包含该cookie的信息,无法通过document.cookie接收该cookie,这种设计是为了提供一种安全的措施,帮助防止通过JavaScript提出的跨站点脚本攻击(XXS)窃取cookie的不良行为。
网上招聘打字员是真的吗?揭露隐藏在背后的惊天骗局。
图7。document.cookie
6、安全
安全指示此cookie是否;只能通过https通知;与其他选项不同,该选项只是一个符号,没有其他价值。
V. Java操作Cookie
1。天然饼干
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 @Override11 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 //添加cookie23 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 @Override11 protected void service(HttpServletRequest req, HttpServletResponse resp){12 //获取cookie信息13 Cookie[] cookies = req.getCookies();14 for (int i = 0; ilt;cookies.length; i++){15 System.out.println(cookies[i].getName() + “:” + cookies[i].getValue());16 }17 }18 19 }
3。删除cookie
//删除Cookie的思绪就是替换原来的cookie,并设置它的生计时间为0Cookie cookie = new Cookie(“Cookie”,null);//cookie名字要相同 cookie.setMaxAge(0); // cookie.setPath(request.getContextPath()); // 相同路径 response.addCookie(cookie);
六。会话
1。分娩支持
其实在Cookie设计之初,并不只是保存一个键值,而是直接保存了用户的信息。但由于cookie存在于客户端,自身存储大小有限,最重要的是用户可见,可以随意修改,相当不安全。为了安全方便地读取全局信息,一种新的存储会话机制Session诞生了。
2。什么是会话
Session翻译成Session,服务器为每个浏览器建立一个会话工具。当浏览器第一次请求服务器时,服务器自然会为浏览器创建一个会话工具,保存在服务器上,并将会话的Id以cookie的形式发送给客户端浏览器,最后用户会显示或者会话超时。
会话原则:
1.当用户向服务器发送第一个请求时,服务器为他建立一个会话,并为这个会话建立一个标识号(会话ID);
2.这个用户的所有后续请求都应该包含这个标识号(sessionID),服务器会检查这个标识号来确定这个请求属于哪个会话;
3.3.sessionID标识号有两种实现方式:Cookie和URL重写;
4.Cookies直接把数据保存在客户端,而Session把数据保存在服务器端,所以Session的安全性更好。
图8。会话事务原则(基于Cookie实现)
3。Java操作会话
1。建立会话
ActionContext actionContext = ActionContext.getContext();Maplt;String, Objectgt; mapSession = actionContext.getSession();mapSession.put(“branch”, branch);mapSession.put(“permission”, per);
2。JSP获取会话
1 if(session.getAttribute(“branch”) == null||session.getAttribute(“permission”) == null)2 {3 response.setCharacterEncoding(“utf-8”);4 out.print(“lt;scriptgt;alert(‘您还没有登录,请登录’) lt;/scriptgt;”);5 out.flush();6 out.close();7 }
3。Java后台获取会话
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.Cookies保存在客户端,容易伪造,不安全;
3.会话被保留在服务器上,这将消耗服务器资源;
4.实现会话有两种方式:Cookie和URL重写。
2。Cookie会带来哪些安全问题?
1.会话强制和XSS:在Web应用程序中,Cookie通常用于象征用户或授权会话。因此,如果Web应用的Cookie被窃取,授权用户的会话可能会受到攻击;常见的窃取Cookie的方式有社会工程攻击和利用应用程序缺陷的XSS攻击;
2.跨站请求伪造(CSRF):维基百科给出了一个CSRF的好例子。比如一个不安全的聊天室或者论坛里的图片,其实就是请求发送一个提现到你的银行服务器上:
lt;img src=”http://bank.example.com/withdraw?account=bobamp;amount=1000000amp;for=mallory”gt;
当你点击打开图片的时候,如果你之前已经登录过你的银行账户,而且Cookie还没有过期,那么你银行里的钱很可能会被自动转走;解决CSRF的设施包括:隐藏域验证码、确认机制和设置短的Cookie生命周期。
3。会话应用场景?
Session主要是服务器端存储,用来展示一些用户信息或者其他相关数据,也可以是其他类型的数据。只要你的业务认为可以绑定到用户或客户端,就可以放入会话。最基本的场景是存储登录用户信息。
4。会话生命周期?
1.建立:如果第一个被访问的资源是JSP页面,建立会话工具;如果遇到的第一个资源是Servlet,就需要手动挪用request.getSession()方法来建立会话工具。
2.销毁:使用session.invalidate()方法销毁session()工具,会话超时默认为30分钟。
客服微信:(181628402)本文链接:https://www.n5w.com/274135.html