JavaWeb之Session、Cookie

本博客基于B站狂神老师的JavaWeb课程,地址:https://space.bilibili.com/95256449,记录自己的代码和老师的笔记,同时也会有自己关于这些知识的理解,如果有错误请评论告诉我。

7,Cookie,会议

7.1会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个网络资源,这个过程可以称为会话。

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,称为有状态会话;

你怎么证明你是西开的学生?

你→西开

1.票务西开给你票务2.学校登记西开标记你来过

一个网站,怎么证明你来过?

怎么让服务端知道客户端来过?

1.服务端给客户端一个信件📃,客户端下次访问服务端带上信件就可以了; 2。服务器登记你来过了,下次你来的时候,我来匹配你;

无状态会话:打开网站,关闭网站;

7.2保存会话的两种技术

饼干

-客户端技术(响应,请求)

会话

-服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或数据放在Session中!

常见场景:网站登录之后,下次你不用再登录了,第二次登录直接就上。

7.3Cookie

![在这里插入图片描述(https://img-blog.csdnimg.cn/20200506182559338.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JlbGxfbG92ZQ==,size_16,color_FFFFFF,t_70)

1.从请求中拿到cookie信息2.服务器响应给客户端

//保存用户上一次访问的时间
public class CookiesDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器告诉你,你来的时间,把这个时间封装成为一个 信件,你下次带来,就知道是你来了

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        PrintWriter out = resp.getWriter();

        //Cookie,服务端从能够客户端获取;
        Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个

        //判断cookie是否存在
        if(cookies!=null){
            //如果存在cookie
            out.write("你上一次访问的时间是:");

            for(Cookie cookie:cookies){
                //获取cookie的名字
                if(cookie.getName().equals("lastLoginTime")){	
                    //获取cookie中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }
            }

        }else{
            out.write("这是你第一次访问");
        }

        //服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
        //cookie的有效期为一天
        cookie.setMaxAge(60*60*24);
        resp.addCookie(cookie);		//响应给客户端一个cookie
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

cookie:一般会保存在本地的用户目录下的appdata;

一个网站的cookie是否存在上限?

  • 一个Cookie只能保存一个信息;
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个;
  • Cookie大小有限制 4kb
  • 300个cookie浏览器上限

删除Cookie:

  1. 不设置有效期,退出浏览器
  2. 把有效期设置为0
public class CookiesDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        //名字必须要和 需要被删除的Cookie 相同(这里是指lastLoginTime)
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");

        cookie.setMaxAge(0);

        //相当于用同名的一个cookie,把之前的cookie的有效期修改成0,那么它就间接的被删除了
        //如果名字不一样,在这样的操作下,之前的cookie还是存在。
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

编码解码

URLEncoder.encode("秦疆","utf-8")
URLDecoder.decode(cookie.getValue(),"UTF-8")

7.4 Seesion

在这里插入图片描述

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Seesion对象;
  • 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
  • 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息;

Session和cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
  • Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务创建;

使用场景:

  • 保存一个登录用户的信息;
  • 购物车信息;
  • 在整个网站中经常会使用的数据,我们将它保存在Session中;
  1. 基本使用
public class CookiesDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器告诉你,你来的时间,把这个时间封装成为一个 信件,你下次带来,就知道是你来了

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        PrintWriter out = resp.getWriter();

        //Cookie,服务端从能够客户端获取;
        Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个

        //判断cookie是否存在
        if(cookies!=null){
            //如果存在cookie
            out.write("你上一次访问的时间是:");

            for(Cookie cookie:cookies){
                //获取cookie的名字
                if(cookie.getName().equals("lastLoginTime")){
                    //获取cookie中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }
            }

        }else{
            out.write("这是你第一次访问");
        }

        //服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
        //cookie的有效期为一天
        cookie.setMaxAge(60*60*24);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  1. 通过Session传递信息
public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();

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

        System.out.println(person.toString());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  1. 删除Session
public class SessionDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();

        //session.removeAttribute("name");
        //删除session后,浏览器会马上自动分配一个新的
        session.invalidate();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

Session自动过期:web.xml配置

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

ervletResponse resp)引发ServletException,IOException {doGet(req,resp);}}

**会话自动过期:web.xml中配置** XML <会话配置> < - 15分钟后会话自动失效,以分钟为单位< - -设置会话重置的失效时间!>! -> <会话超时> 15 </会话超时> </会话配置> `

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值