Cookie
1、什么是Cookie
Cookie是 servlet 发送到 Web浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。Cookie 的值可以唯一地标识客户端,因此 Cookie常用于会话管理。
一个cookie 拥有一个名称、一个值和一些可选属性,比如注释、路径和域限定符、最大生存时间和版本号。
每个cookie大小限定为4KB
2、为什么要使用Cookie?解决了什么问题
web程序是使用HTTP协议传输的,而HTTP协议是无状态的协议,对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
cookie的出现就是为了解决这个问题。
第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。
特点:cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。
给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
3、Cookie的创建
客户端向服务器端发送一个请求的时,服务端向客户端发送一个Cookie然后浏览器将Cookie保存
Cookie有两种保存方式,一种是浏览器会将Cookie保存在内存中,还有一种是保存在客户端的硬盘中,之后每次HTTP请求浏览器都会将Cookie发送给服务器端。
下面是通过代码来创建
public void createCookie(HttpServletResponse response) throws IOException {
//创建cookie对象
Cookie cookie = new Cookie("key1", "value1");
//通知客户端保存cookie
response.addCookie(cookie);
response.getWriter().write("cookie创建成功");
}
服务器通过响应头set-cookie通知客户端保存Cookie
客户端收到响应后,发现有set-cookie响应头,就去看一下,有没有这个Cookie,没有就创建,有就修改。
服务端发送响应后,按下F12,我们可以在响应标头中果然有set-cookie
在创建完成后,我们可以在Cookie一栏中看到成功创建出以 key1 为键的cookie对象
4、服务器获取Cookie
服务器获取Cookie,则是通过请求头,Cookie把Cookie信息发送给服务器
下面是通过代码获取cookie
public void getCookie(HttpServletRequest request, HttpServletResponse response) throws IOException{
Cookie[] cookies = request.getCookies();
}
通样是按下F12,我们可以在请求标头中找到Cookie
5、Cookie的生存周期
Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。
有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。
下面我们通过代码创建一个cookie,其中cookie的默认生命周期就是-1
public void defaultCookie(HttpServletResponse response) {
Cookie cookie=new Cookie("defaultLife","defaultLife");
//setMaxAge()生命控制,控制Cookie什么时候销毁
//正数,表示在指定的秒数后销毁; 负数,表示浏览器一关就销毁,默认-1; 零表示马上销毁
cookie.setMaxAge(-1);
response.addCookie(cookie);
}
此时我们查看浏览器的cookie项,就创建了一个生存周期为-1的cookie
接下来我们复制一下浏览器地址,然后关闭当前浏览器并开启一个新的浏览器
此时cookie已经全部销毁了
如果创建的cookie的生命周期设为正数,则是以秒为单位设定存活时间
public void liveCookie(HttpServletResponse response) {
Cookie cookie=new Cookie("live","live");
//时间为格林时间,比北京时间晚八个小时
cookie.setMaxAge(3600);
response.addCookie(cookie);
}
值得一提的是,cookie的生命周期时间显示的是格林时间,所以当我们在浏览器查看时会比我们国内时间 晚 八个小时。
因而当我们创建3600秒也就是一个小时的存活时间时,该cookie会在 当前时间 减 8 小时 加 1 小时 后销毁
6、Cookie的有效路径Path的设置
Cookie的 path 属性可以有效地过滤哪些Cookie 可以发送给服务器,哪些不发。
path 属性是通过请求的地址来进行有效的过滤。
此时有两个Cookie
-
CookieA path=/工程路径
-
CookieB path=/工程路径/abc
下面有两个请求地址:
- 请求地址1为 http://ip:port/工程路径/a.html
此时该请求路径符合CookieA的path,而不符合CookieB的path
则CookieA 进行发送,CookieB 不进行发送
- 请求地址2为 http://ip:port/工程路径/abc/a.html
此时该请求路径符合CookieA的path,也符合CookieB的path
则CookieA 进行发送,CookieB 也进行发送
下面通过代码创建一个带有path的cookie
public void CookiePath(HttpServletResponse response) {
Cookie cookie=new Cookie("path1","path1");
cookie.setPath(request.getContextPath()+"/abc");
response.addCookie(cookie);
}
然而当我们执行创建指令后,cookie栏中却并没有发现该cookie对象
我们查看响应头可以看到,该cookie的path设定为/cookie/abc
也就是工程路径后必须有abc,但我们查看浏览器当前路径并没有abc,于是浏览器出于安全考虑将该cookie过滤掉了,没有创建该cookie
当我们把浏览器路径改为 工程路径/abc后,cookie成功创建了
7、Cookie有哪些缺陷
数量受到限制
。一个浏览器能创建的 Cookie 数量最多为 300 个,并且每个不能超过 4KB,每个 Web 站点能设置的Cookie 总数不能超过 20 个安全性无法得到保障
。通常跨站点脚本攻击往往利用网站漏洞在网站页面中植入脚本代码或网站页面引用第三方法脚本代码,均存在跨站点脚本攻击的可能,在受到跨站点脚本攻击时,脚本指令将会读取当前站点的所有Cookie 内容(已不存在 Cookie 作用域限制),然后通过某种方式将 Cookie 内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。浏览器可以禁用Cookie
,禁用Cookie后,也就无法享有Cookie带来的方便。
Session
1、什么是Session
session就是会话,是用来维护一个客户端和服务器之间关联的一种技术
在计算机中,尤其是在网络应用中,称为“会话控制
”。Session 对象存储特定用户会话所需的属性及配置信息。
每个客户端都有自己的一个Session会话
与服务器不同,Session将信息保存在服务端
2、创建Session
- 当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。之后调用都是获取前面创建好的Session会话对象
- 这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
- 服务器会向客户浏览器发送一个每个用户特有的会话编号sessionID,让他进入到cookie里。
- 服务器同时也把sessionID和对应的用户信息、用户操作记录在服务器上,这些记录就是session。再次访问时会带入会发送cookie给服务器,其中就包含sessionID。
- 服务器从cookie里找到sessionID,再根据sessionID找到以前记录的用户信息就可以知道他之前操控些、访问过哪里。
下面还是通过代码演示
protected void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws IOException {
//获取Session会话对象
HttpSession session = request.getSession();
//获取Session的id
response.getWriter().write(session.getId()+"<br>");
//判断Session是否为新创建的
response.getWriter().write(session.isNew()+"<br>");
}
结果得到Session的id值,同时也判断得知该Session为新创建的
此时我们再次创建,便发现,id值不变,但 isNew()为false,也就是说该Session不再是新创建的了
3、Session的生命周期
根据需求设定
,Session的超时时长指的是,客户端两次请求的最大间隔时长,Session的默认超时时长为半小时。举个例子,你登录一个服务器,服务器返回给你一个sessionID,登录成功之后的半小时之内没有对该服务器进行任何HTTP请求,半小时后你进行一次HTTP请求,会提示你重新登录。
下面我们通过代码设置一下Session的超时时长
protected void threeTimeBroken(HttpServletRequest request, HttpServletResponse response) throws IOException{
//若为正数则为超时秒数,若为负数则永不超时
request.getSession().setMaxInactiveInterval(3);
response.getWriter().write("session的超时时长已设置<br>");
}
这里我们是设置Session的超时时长为3秒
此时我们点击之前的创建Session,它判断是否为新创建的对象时 还是false
三秒后再次点击,SessionID也发生了改变,说明之前的Session对象被销毁了
与Cookie不同的是,Session不能通过设置超时时长为0达到立即销毁,只能去调用其他api
protected void deleteSession (HttpServletRequest request, HttpServletResponse response) throws IOException{
//获取Session对象,并使其立即超时
request.getSession().invalidate();
response.getWriter().write("session已超时<br>");
}
成功销毁并创建新的Session对象
Cookie和Session的区别和联系
Cookie 保存在客户端浏览器中,而 Session 保存在服务器上。
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是 Session 。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
Cookie 只是一个通行证,但并不是安全的,任何安全的校验必须要在服务端上完成,cookie只是存在客户端上面的一个唯一标识它且由服务端定制的信息,本地可以改,但是不管怎么改,最后还是需要把它拿上发送给服务端进行匹配校验
Sesssion 的唯一辨识 SessionId 是通过 Cookie 的形式存储在客户端的
web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:
- 存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。
- 将session数据加密,然后存储在cookie中。