Cookie和Session

Cookie和Session

一、会话

用户打开了一个浏览器,点击了很多个链接,访问很多个web资源,然后关闭浏览器,这个过程称之为会话

思考问题:在这个会话的过程中,服务端是如何知道客户端是否曾经访问过呢?(就好比超市是如何区分新顾客还是老顾客呢)

答案:第一种方式:超市给来过的每位客户发一个超市专属的购物卡,每次结账之后出示购物卡就可以了;【Cookie】

第二种方式:每位客户来到超市直接注册一个超市的账号,这样子每次结账只需说明自己的电话号码便可;【Session】

二、保存会话的两种技术

Cookie:客户端技术(请求和响应)

Session:服务器端技术(在服务端保存客户端会话的信息)

使用场景:网站登录之后,下次不用再次登录就可以直接进行访问

三、Cookie

从请求中拿到Cookie信息

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求和响应的字符集(解决中文乱码问题)
        resp.setContentType("text/html;charset=utf-8");

        PrintWriter out = resp.getWriter();
        //客户端从服务器端拿到Cookie
        Cookie[] cookies = req.getCookies();
        if (cookies != null){
            out.write("第一次访问的时间是:");
            for (int i = 0; i < cookies.length ; i++) {
                Cookie cookie = cookies[i];
                //cookie的名字进行比对
                if (cookie.getName().equals("time")){
                    //获取cookie中的值
                    long time = Long.parseLong(cookie.getValue());
                    Date date = new Date(time);
                    out.write(date.toLocaleString());
                }
            }
        }else {
            resp.getWriter().println("这是第一次访问");
        }
        Cookie cookie = new Cookie("time",System.currentTimeMillis()+"");
        //设置cookie有效期为一天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
    }

服务器端响应给客户端cookie

一个cookie只能保存一个信息,一个web网站可以给浏览器发送多个cookie,最多存放20个

四、删除Cookie的方式:

不设置有效期,关闭浏览器便会自动失效

设置有效期时间为0

五、Session

1、什么是Session?

​ 在web应用的用户来说,登录一个网站,需要创建一个数据结构以存储用户的登录信息,这个结构叫做session;

​ 服务器会给每一个用户创建一个Session对象

​ 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在

​ 翻译过来就是:当用户访问某个网页的时候,就会在服务端开辟一块内存,这块内存就是session,而这个内存是跟浏览

​ 器的窗口相互关联的,只允许当前这个session对应的浏览器窗口访问;

2、Session实现原理

​ 当服务器端创建完Session对象之后,会把Session对象的SessionId以Cookie的形式返回给客户端,然后客户端SessionId 传递给服务器端,服务器根据SessionId来为用户提供服务(注意:这个SessionId就是浏览器和服务器之间一一对应的 唯一标识)

3、Session的两种实现方式

​ 第一种实现方式:通过Cookie来实现

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setCharacterEncoding("UTF-8");
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();

        //给Session中存东西
        session.setAttribute("name",new Person("汤姆",2));

        //获取Session的Id
        String sessionId = session.getId();

        //判断Session是不是新创建的
        if (session.isNew()){
            resp.getWriter().write("Session创建成功,ID:"+sessionId);
        }else {
            resp.getWriter().write("Session已经在服务器中存在了,ID:"+sessionId);
        }
    }
@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();

        Person person = (Person) session.getAttribute("name");

        String s = person.toString();
        resp.getWriter().write(s);
    }
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        //手动注销Session
        session.invalidate();
    }

​ 第二种实现方式:通过Url重写来实现 (如何重写Url?通过response.encodeURL()方法)

4、会话自动过期:Web.xml配置
<!--设置session默认的失效时间-->
    <session-config>
        <!--1分钟后session自动失效-->
        <session-timeout>1</session-timeout>
    </session-config>
5、使用场景

​ 例如保存购物车的信息就可以保存在Session中

​ 或者在网站中经常会使用到的信息

六、Session和Cookie的区别

​ Session是存储在服务端,Cookie是存储在客户端

​ Cookie是把用户的数据写给用户的浏览器(例如把用户的账号密码写到用户的浏览器缓存中)

​ Session技术是把用户的数据写到用户独占的session中,session又是保存在服务器端的

​ Session对象是由服务器端创建的,可以通过request请求getSession方法得到session对象

posted @ 2023-05-08 11:20  ~淡~然~  阅读(20)  评论(0)    收藏  举报