为什么我们要用cookie和session?
首先,先说说Http,首先我们都知道的http是无状态的,什么是无状态?,就指协议对事务处理没有记忆能力,缺少状态意味着->如果后续处理需要前面的信息,需要重传,那么我每次连接传输的数据量就会很大,1,1+1,1+2,1+3...这不巨难受;它不像我们的Socket那样,连接了两个终端,夹个通道随便相互发信息通信,http的客户端只能通过请求服务器获取相关文件内容以及信息;
那么问题来了,我们做一个网站,怎么在其他页面中也保存用户信息呢?,毕竟我登录之后要执行业务操作,我不可能每弄一次还把前面的完成不;
Cookie和Seesion对于应用
当客户端访问服务器时,服务器根据需求设置 Session,将会话信息保存在服务器上,同时将标示 Session 的 SessionId 传递给客户端浏览器,浏览器将这个 SessionId 保存在内存中,我们称之为无过期时间的 Cookie。浏览器关闭后,这个 Cookie 就会被清掉,它不会存在于用户的 Cookie 临时文件。
以后浏览器每次请求都会额外加上这个参数值,服务器会根据这个 SessionId,就能取得客户端的数据信息。
如果客户端浏览器意外关闭,服务器保存的 Session 数据不是立即释放,此时数据还会存在,只要我们知道那个 SessionId,就可以继续通过请求获得此 Session 的信息,因为此时后台的 Session 还存在,当然我们可以设置一个 Session 超时时间,一旦超过规定时间没有客户端请求时,服务器就会清除对应 SessionId 的 Session 信息。
Cookie和Session的生命周期与工作原理
(30条消息) Session的生命周期和工作原理_PY教义的博客-CSDN博客_session的生命周期
ServletContext
前几天用ServletContext弄了个监听器统计了在线人数,有一说一,这玩意好使,跟application类似,代表Servlet上下文对象,所有Servlet共享;
它是一个域对象——>可以像Map一样储存数据,这个域就是整个web工程
(29条消息) ServletContext类的介绍和使用_你好牛蛙的博客-CSDN博客
package com.koko.config;
import org.springframework.stereotype.Component;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.HashSet;
/**
* @author diao 2022/6/9
*/
@WebListener
@Component
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
//得到ServletContext,将所有人session放入
ServletContext context = session.getServletContext();
//用set进行储存
HashSet<HttpSession> sessionSet = (HashSet<HttpSession>) context.getAttribute("sessionSet");
if(sessionSet==null){
sessionSet=new HashSet<HttpSession>();
context.setAttribute("sessionSet",sessionSet);
}
//遍历集合中所有session,校验用户是否登录
for (HttpSession s : sessionSet) {
//已经登录过
if(s.getAttribute("nickname")==session.getAttribute("nickname")){
sessionSet.remove(s);
};
}
sessionSet.add(session);
//存储在线人数
context.setAttribute("count",sessionSet.size());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
}
补:今天写单点登录的时候在想除了redis有没有可以其他的解决方案
但是发现ServletContext是不行的,每一个主机都有自己的servlet上下文,他是不能被共享的,上下文属性规定了只能是本地;