目录
Session
session对象最主要的作用是:保存会话状态。(用户登录成功了,这是一种登录成功的状态,你怎么把登录成功的状态一直保存下来呢?使用session对象可以保留会话状态。)
为什么需要session对象来保存会话状态呢?
因为HTTP协议是一种无状态协议。所以提出了session机制来保存状态
什么是无状态:请求的时候,B和S是连接的,但是请求结束之后,连接就断了。为什么要这么做?HTTP协议为什么要设计成这样?因为这样的无状态协议,可以降低服务器的压力,不然很多人发送请求,一直和服务器保存连接,服务的压力是很大的。请求的瞬间是连接的,请求结束之后,连接断开,这样服务器压力小。
只要B和S断开了,那么关闭浏览器这个动作,服务器知道吗?
不知道。服务器是不知道浏览器关闭的,服务器不知道你还有没有登录。
所以需要用session来保存登录状态
使用session保存登录状态的原理
@RequestMapping(value = "/userLogin")
public String userLogin(String userName, String password,HttpServletRequest request){
// 获取对应的session,没有则创建新的。
HttpSession session = request.getSession();
User user = new User(userName, password);
// 将登录成功的user对象存到session对象中
session.setAttribute("loginUser",user);
// 登录成功跳到主页面
return "main";
}
1、张三打开一个浏览器A,李四打开一个浏览器B,第一次登录访问服务器之后,在服务器端会生成:
-
张三专属的session对象
-
李四专属的session对象
同时会生成各自对应的sessionID,然后将各自的sessionID发给浏览器。
服务器端是以一个Map来保存session的,key是sessionID,value是对应的session对象;
浏览器是以cookie的形式保存sessionID,JSESSIONID=xxxxxx。
2、后面浏览器再发送请求,就会将这个各自的sessionID发给服务器,服务器拿到后,根据这个sessionID获取对应的session对象,取出里面的登录对象user。如果没登陆过就没有这个user对象,如果没有sessionID也说明没登陆过。
// 在目标方法执行前执行,请求执行前,所有请求前处理
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
// 根据浏览器发过来的sessionID,获取对应的sessionID,没有则创建新的
HttpSession session = request.getSession();
// 取出session中的 loginUser 对象,登录过会存
Object loginUser = session.getAttribute("loginUser");
if (loginUser != null) {
return true;// 放行
}
return false;// 拦截
}
3、然后如果浏览器关闭,保存在内存的cookie就没了,也就是sessionID没了,这样后面再打开浏览器就需要重新登录。或者安全退出后端销毁session对象。
Cookie
cookie其实就是保存在浏览器上面的一个key-value键值对,比如sessionID=xxx就是一个cookie。
cookie是保存在浏览器客户端上的。
-
可以保存在运行内存中。(浏览器只要关闭cookie就消失了。)
-
也可以保存在硬盘文件中。(永久保存,只有清除cookie才会消失。)
cookie经典案例实现十天免登录功能
用户输入正确的用户名和密码,并且同时选择十天内免登录。
后端创建cookie保存这个正确的用户名和密码,并设置cookie的存活时间为十天
设置这个cookie对应的路径为126.com
然后将这个cookie发送给浏览器
登录成功后。浏览器客户端会保存一个cookie,这个cookie中保存了用户名和密码等信息,这个cookie是保存在硬盘文件当中的,十天有效。在十天内用户再次访问126.com的时候,浏览器自动提交126.com的关联的cookie给服务器,服务器接收到cookie之后,获取cookie中的用户名和密码,验证,通过验证之后,自动登录成功。
cookie和url对应
在HTTP协议中是这样规定的:每一个cookie都对应一个路径url,当浏览器发送请求的时候,只要这个url和cookie匹配上了,就会自动发送(request)该路径url对应下的cookie给服务器。(URL。)
只会发送URL下对应的cookie给服务器。