Cookie和Session

1. Cookie和Session的原理

1.1. 如何解决HTTP协议无状态问题

HTTP是无状态的,客户每次读取web页面时,服务器都打开新的连接,而且服务器也不会自动维护客户的上下文信息。
session和cookie就是两种HTTP无状态的解决方法
session将信息保存在服务端,cookie将信息保存在客户端
在这里插入图片描述

1.2. Cookie和Session的原理

Cookie:发给顾客一张卡,上面记录着消费数量、有效期。每次消费时,顾客出示卡片,则此次消费会和之前的消费联系起来。这种做法就是在客户端保持状态。(记录所有信息)
Session:发给顾客一张会员卡,除了卡号之外其他信息都不记录,每次消费时,顾客出示卡片,则店员找到卡号相对应的消费信息。这种做法就是在服务器端保持状态。(只记录ID,ID对应的详细信息在数据库中,每次通过ID查询匹配)

1.3. Cookie实现免登陆

	@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 接受前台页面的数据
        String uname = req.getParameter("uname");
        String pwd = req.getParameter("pwd");
        String ch = req.getParameter("ch");
        // 2. 数据处理-连接数据库作比较,返回结果
        boolean flag = false;
        if("wyb".equals(uname) && "123".equals(pwd)) {
            flag = true;
        }
        // 3. 根据返回的结果给用户做出响应
        if(flag) {
            // 使用cookie记住密码
            // 把uname中文字符串进行UTF-8格式化
            String encode = URLEncoder.encode(uname, "UTF-8");
            System.out.println(encode);
            // 设置cookie
            Cookie cookie = new Cookie("u", encode);
            Cookie cookie1 = new Cookie("p", pwd);
            // 设置有效范围,/:在当前服务器内有效
            cookie.setPath("/");
            cookie1.setPath("/");
            // 设置cookie的有效期
            if("yes".equals(ch)) {
                // 勾选了记住密码
                cookie.setMaxAge(60*60*24*30);
                cookie1.setMaxAge(60*60*24*30); 
            }else {
                cookie1.setMaxAge(0);
                cookie.setMaxAge(0);
            }
            resp.addCookie(cookie);
            resp.addCookie(cookie1);
            // 登录成功
            resp.sendRedirect("/success.jsp");
        }else {
            // 登录失败
            resp.setAttribute("msg", "用户名或密码错误");
            req.getRequestDispatcher("/login.jsp").forward(req, resp);
        }
    }

在这里插入图片描述

1.4. Session原理

实现功能:登录成功后跳转到成功页面,显示用户名,后续操作均能显示当前登录的用户名;登录失败跳回登录页面

// 1. 获得session对象
HttpSession session = Request.getSession();
// 2. 将相应的值存入session中
session.setAttribute("username", uname);
  1. Session的失效时机
    • 手动注销session:Session.invalidate()
    • 超过最大非活动间隔时间:默认为30min,可以更改默认时间
      • 更改TomCat中web.xml配置:会影响所有项目的所有session
        <session-config> <session-timeout>30</session-timeout> </session-config>
      • 更改自己项目的web.xml配置,影响当前项目的所有session
      • 更改当前项目的当前session失效时间:session.setMaxInactiveInterval(10);
    • 关闭浏览器(该方式没有立刻结束session):只是把保存在浏览器中的cookie中的session清除了,服务器中的session没有真正的消失
      在这里插入图片描述
  2. session和cookie的区别
    • cookie数据存放在客户端,session数据存放在服务器上(sessionid可以通过cookie保存在客户端,也可用URL重写)
    • cookie不是很安全(可以加密),考虑到安全应当使用session
    • session会在一定时间内保存到服务器上。当访问增多,会占用较多的服务器资源。考虑到减轻服务器负担方面,应使用cookie
    • 单个cookie在客户端的限制是3k。cookie的数据都以字符串的形式保存,session中可以保存对象信息

2. 统计网站访问人数

  1. 实现思路
    • 使用JSP:只能记录一个网页的访问次数
    • 使用session:就好比自己的购物车一样,不符合要求
    • 使用ServletContext:一个项目/应用所有用户共享一个实例,相当于全局变量
// 获得全局对象
ServletContext context = req.getServletContext();
// 1. 获取之前登录的人数
Integer count = (Integer) context.getAttribute("count");
if(count == null) {
    // 当前用户是第一个登录的人
    count = 1;
}else {
    count++;
}
// 将记录的值保存在context中
context.setAttribute("count", count);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Qi妙代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值