无状态管理
例: Http协议就是一个无状态的协议
HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,就会在每一次创建一个新的;
说白了就是用户每一次在操作浏览器的时候的状态(一般普通的请求都是分为三步):
1、客户端发送请求给服务器
2、服务器处理该请求
3、服务器将处理结果响应该客户端。
一旦这基本的过程走完,之后该客户端再次向该服务区发送请求后,但是服务器端并不能知道这两个请求是否是同一个浏览器(用户)发出来的;
就当你用你的电脑使用浏览器访问了某个网站,并且登录了你的账号或者密码,当你关闭服务器的时候,那么你的登录状态也跟着退出,如果你每天都需要访问这个网站,那就会导致你每一次都需要进行登录操作,因为上面也说了;
所以我们要想的就是怎么样可以保持或记录该用户的状态(或是信息)
我们可以使用Session或Cookie保持来保持这种
(往下看Session,Cookie)
来个不怎么标准的状态管理解释:
状态管理就是,将客户端和服务器的多次交互当作一个整体,
将多次交互所涉及的数据状态保存下来。
解决方式:
1、保存在cookie中
2、保存在session中
3、保存在本地存储当中
4、其他方式,使用第三方状态管理框架,如:Vuex
Session
***陈述:***
同一个客户端与服务器端的在一段时间内的多次交互(可以理解为访问数据),我们就可以称该客户端为该服务器端的一个客户端会话窗口,有了会话窗口,我们就能确定哪个请求是哪个用户发出的了,从而可以实现会话跟踪,并记录用户的行为。
会话原理:
说简单一点就是你打开一个浏览器,这就是开启了一个会话,访问该web服务器的多个资源,然后关闭浏览器,这中间的一系列过程称之为一个会话。
再说简单一些就是你在当前页面使用session保存了数据,那么你可以在同一个网站,不同的页面访问这些你在session保存好的数据
Session与cookie功能效果相同。
Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。
创建session对象
protected void CreateOrGetSession (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建或获取Session会话对象
HttpSession session = req.getSession();
//判断当前Session会话是否是新创建出来的
boolean isNew = session.isNew();
//获取Session会话的唯一标识 id
String id = session.getId();
JSP内置对象session
protected void CreateOrGetSession (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// session添加数据的方法
session.setAttribute("uname", uname);
session.setAttribute("upwd", upwd);
// session通过key获取对象值
session.getAttribute("uname"); // 参数填写要获取的键
session.getAttribute("upwd");
// 设置session的有限时间
// 值为正数的时候,设定 Session 的超时时长
session.getMaxInactiveInterval("60*60*24*2"); // 单位(秒)
//负数表示永不超时(极少使用,因为如果不销毁就会一直占用内存空间)
session.getMaxInactiveInterval(-1);
// 获取session的有限时间
session.getMaxInactiveInterval("60*60*24*3");
// 获取session的对象编号
session.getId();
// 设置session对象失效
session.invalidate(); // 让当前 Session 会话马上超时无效
}
Cookie
Cookie是Web服务器保存在客户端的一系列文本信息
Cookie的作用
对特定对象的追踪
统计网页浏览次数
简化登录
安全性能:
容易信息泄露
会话 Cookie 有个特征,客户端关闭时 Cookie 会删除,因为它没有指定Expires或 Max-Age 指令。但是,Web 浏览器可能会使用会话还原,这会使大多数会话 Cookie 保持永久状态,就像从未关闭过浏览器一样。
protected void CreateOrGetCookie (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=reqeust.getParameter("username");
//以key/value的形式创建Cookie
Cookie uname=new Cookie("uname", username);
//将Cookie对象保存在客户端
req.addCookie(uname);
// 设置Cookie的有限时间,以秒为单位
uname.getMaxAge("60*60*24*2");
// 获取Cookie的有限时间,以秒为单位
uname.getMaxAge();
}
<%//获取请求中的Cookie,以数组方式保存
Cookie cookies[]=request.getCookies();
//循环遍历数组,得到key=uname的Cookie
for(int i=0;i<cookies.length;i++){
Cookie ucookie=cookies[i];
if(ucookie.getName().equals("uname”));//判断Cookie的名称
%>
欢迎你:<%=ucookie.getValue() %>//获取key对应的value,输出显示
<% } %>