从Http思考项目中的cookie和session+ServletContext

为什么我们要用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上下文,他是不能被共享的,上下文属性规定了只能是本地;

(30条消息) ServletContext详解_杜河鹰的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fairy要carry

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

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

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

打赏作者

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

抵扣说明:

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

余额充值