状态管理之cookie和session

我们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,那么流程图如下图所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAU3NobV82NjY=,size_20,color_FFFFFF,t_70,g_se,x_16

 用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集合,如下图,里面有很多的键值对都是根据上面代码创建出来的:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAU3NobV82NjY=,size_20,color_FFFFFF,t_70,g_se,x_16

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发送回客户端

流程如下图所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAU3NobV82NjY=,size_20,color_FFFFFF,t_70,g_se,x_16 

 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(); 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sshm_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值