我们web网站常用的http协议是一种无状态协议,他无法保存用户的信息,假如说有几个不同的用户登录后进行购物,http协议是无法判断出是谁进行了购物,是谁购买了哪些东西。为了解决这种问题我们常用的方法是使用cookie和session。
什么是状态管理:
将浏览器和web服务器之间多次交互当成一个整体来处理,并且将多次交互所涉及的数据保存起来。
状态管理分类:
客户端状态管理:将状态保存在客户端。代表性技术就是cookie技术。
服务端状态管理:将状态保存在服务端,代表性技术就是session技术。
一、Cookie会话
什么是cookie:
Cookie是服务器发送到用户浏览器并保持在本地的一小块信息(也可以在浏览器直接保存这块信息),它会在浏览器下次向服务器发起请求时被携带并发送到服务器上。通常,它会用于告知服务端两个请求是否来自同一个浏览器。
1.如果是在js中创建cookie对象,会直接将信息存储在浏览器当中。创建后会在request请求中携带。JavaScript创建需要调用的代码如下:
function setCookie(cname,cvalue,exdays){ var d = new Date(); d.setTime(d.getTime()+(exdays*24*60*60*1000)); var expires = "expires="+d.toGMTString(); document.cookie = cname + "=" + cvalue + "; " + expires;}
cname是创建的cookie名称,cvalue是值,exdays是是设置的过期时间以天为单位。
2.如果是在服务器端创建的cookie,那么流程图如下图所示:
用servlet创建cookie对象时的代码如下:
@WebServlet("/cs")public class CookieServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.服务端创建cookie对象Cookie cookie = new Cookie("username", "name"); //2.设置cookie有效期 1 小时 cookie.setMaxAge(60*60); // 存储数据有三种方式:>0有效期,单位秒;=0浏览器关闭;<0 临时存储,默认为-1//3.将cookie响应给客户端resp.addCookie(cookie);}}
cookie信息创建后可以在浏览器中查看,比如百度页面打开时就会给你创建cookie集合,如下图,里面有很多的键值对都是根据上面代码创建出来的:
3.cookie的获取
浏览器用JavaScript获取cookie的代码如下所示,调用后就可以获取到值:
function getCookie(cname){ var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i<ca.length; i++) { var c = ca[i].trim(); if (c.indexOf(name)==0) { return c.substring(name.length,c.length); } } return "";}
在服务器用servlet获取cookie的值代码如下所示:
@WebServlet("/getCookie")public class GetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 通过request对象获取所有的cookieCookie[] cookies = req.getCookies();// 通过for循环遍历cookieif (cookies != null) {for (Cookie cookie : cookies) {System.out.println(cookie.getName() + " " + cookie.getValue());}}}}
在服务器端创建cookie对象时,尽量不要创建键值对是中文的cookie对象,会造成乱码,因为cookie默认不支持中文,只能包含ascll码。所以cookie需要对Unicode进行编码,还要进行解码很麻烦。
Cookie的优缺点:
优点:
1.可配置到期时间
2.简单型:cookie是一种包含文本轻量结构,包含简单的键值对
3.数据持久性:cookie默认在过期之前一直保存在本电脑上
缺点:
1.大小受限制:大多数浏览器对cookie的大小有限制,分别是4kb和8kb
2.用户配置禁用:有些用户禁用了浏览器或者客户端设备接收cookie的能力,限制的这一功能
3.潜在的安全风险:cookie可能被恶意更改。
二、session对象
什么是session:
session也用于记录用户的状态。session是指在一段时间之内,单个客户端与web服务端的一连串的交互过程,多次请求属于一次会话(就相当于两个人的一次聊天 ,聊完会话结束)。
在一个session中,客户可能会多次请求访问各种不同的服务器资源。
session原理:
服务器会为每次会话分配一个sessionid
同一个浏览器同一个时间段内发起多次请求,属于一次session会话
首次使用session时,服务器会自动创建sessionid,并创建cookie存储sessionid发送回客户端
流程如下图所示:
session的使用:
1.获取sessionid代码如下:
public class CookieServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 通过request对象获取Session对象HttpSession session = req.getSession();// 获取sessionidSystem.out.println(session.getId());}}
一般当我们关闭浏览器是就相当于一次会话的结束,再重新打开浏览器创建的sessionid和第一次打开创建的sessionid是不同的也说明了这是两次不同的会话。
2.用session保存数据:
// 1. 通过request对象获取Session对象
HttpSession session = req.getSession();session.setAttribute("key", value); //以键值对的形式存储在session当中
3.session获取数据
// 1. 通过request对象获取Session对象
HttpSession session = req.getSession();session.getAttribute("key"); // 通过String类型的key访问Object类型的value
4.session移除数据
// 1. 通过request对象获取Session对象
HttpSession session = req.getSession();session.removeAttribute("key"); // 通过key值删除session中的值
session的生命周期
开始:第一次使用session时创建session对象
结束:
1.浏览器关闭
2.session超时失效
3.手动销毁失效:session.invalidate();