11 Cookie和Session

学习Cookie和Session之前我们先理解一下会话

1 会话

会话:打开一个浏览器,访问网页,然后关闭浏览器,这个过程叫一次会话。
有状态会话:你用浏览器访问了一个网站,网站知道了你曾经访问过,这就是有状态会话,
那么问题来了,网站怎么知道你来过呢?
我们来举个生活中签到的例子:
你去公司签到,怎么证明你今天到了

  • 1 公司给你个签到条,上面写着日期名字
  • 2 你刷卡,公司把你今天刷卡记录保存下来
    两种方式第一个是你保存了凭据,第二种是公司保存了凭据
    根据上面的例子,我们来类比一下,
    你就是浏览器,公司是服务器;
    Cookie是第一种方式,Session是第二种方式。
    (显而易见,刷卡方式(Session)比较好一些,Cookie方式Low一些,我们重点掌握Session,理解Cookie)

2 Cookie

理解一下Cookies对象是以数组形式存储的,是一个Cookie组成一个数组;
常用的Cookie方法:

  • 获取Cookies
  • 创建Cookie
  • 添加Cookie到Cookie

如何获取Cookies:

Cookie[] cookies = req.getCookies();

如何创建Cookie

Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");

如何添加

resp.addCookie(cookie);

接下来我们做一组Demo,用Cookie记录一下上次访问时间,打印到页面上

public class TestCookie1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();

        Cookie[] cookies = req.getCookies();

        if (cookies!=null){
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("lastLoginTime")){
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toGMTString());
                }
            }
        }else {
            System.out.println("first visit");
        }

        //给lastLoginTime赋值
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
        resp.addCookie(cookie);

    }
}
<servlet>
        <servlet-name>c1</servlet-name>
        <servlet-class>com.duowei.servlet.TestCookie1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>c1</servlet-name>
        <url-pattern>/c1</url-pattern>
    </servlet-mapping>

我们访问C1,第一访问没有打印出 lastLoginTime ,第二次访问时候访问可以看到Cookie里的lastLoginTime。
在这里插入图片描述

3 Session

Session的用法跟Cookie的相似

  • 获取Session
  • 获取SessionID
  • 判断Session是不是新的
  • 给Session设置键值对
public class TestSession1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //获取Session
        HttpSession session = req.getSession();
        session.setAttribute("name", "weiduo");
        //获取SessionID
        String sessionId = session.getId();
        //判断Session是不是新的
        if (session.isNew()) {
            resp.getWriter().write("成功创建session,sessionId==" + sessionId);
        } else {
            resp.getWriter().write("session已经存在");
        }
        String name = (String) session.getAttribute("name");
        System.out.println(name);

    }
}
<servlet>
        <servlet-name>s1</servlet-name>
        <servlet-class>com.duowei.servlet.TestSession1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>s1</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>

我们观察一下Session ID 存到了Cookie里了
可以理解为你要获得仓库里的东西,不用把仓库搬到你家里,而是把仓库钥匙带上就可以了。
在这里插入图片描述
下面的Session方法可以自己跑一下demo
移除Session属性

session.removeAttribute("name");

还没有完,Session如何失效呢?有两种模式,

  • 手动失效
  • 失效时间到期
session.invalidate();

在web.xml里面设置

<!--设置Session默认的失效时间-->
<session-config>
    <!--15分钟后Session自动失效,以分钟为单位-->
    <session-timeout>1</session-timeout>
</session-config>

最后说完了Cookie和Session,我们知道了会话技术可以获取用户自己的数据,如

  • 保存用户名密码信息
  • 购物车
  • 收藏夹等等

但是如何获取用户之间的共享数据呢?比如网站的访问人数
那么可以用到ServletContext,想了解可以看一下我之前写的博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值