JavaWeb---Cookie与Session

##前言

  • Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件。
  • 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会在案例中根据不同的需求引入。
  • 首先了解javaWeb的整个技术体系,掌握常用的技术知识点。

这篇文章我们来详细的学习一下Cookie与Session,注意它们之间的区别

注:注:本篇博客是参考于B站遇见狂神说的JavaWeb讲解视频进行编写,原视频地址为【狂神说Java】JavaWeb入门到实战,大家记得三连啊✧(≖ ◡ ≖✿)
下面我们进入正题!

1、Cookie、Session

1.1、会话

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

有状态会话:记录了一些信息

大家在浏览网站的过程中有没有思考过这样一个问题,一个网站怎么证明客户访问过呢?

客户端 服务端

1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了 : cookie

2.服务器登记客户已经来过了,下次访问的时候直接匹配登记过的客户 ; session

3.大家可以先看一下这张图,下面对Cookie与Session的讲解就是围绕这张图展开的,最后会对这张图进行详细的讲解

1.2、保存会话的两种技术

1.2.1、cookie
  • 客户端技术(响应,请求)
  • cookie一般是以键值对的形式进行表示的(key-value)
  • 我们登录过一个网站,当我们再次打开就不需要再次登录了
1.2.2、session
  • 服务器技术(保存用户的会话信息,可以把信息或者数据放在session中)
  • 每个客户端都有自己的一个Session会话
  • Session会话中,我们经常用来保存用户登录之后的信息

大部分的网站:网站登录之后,下次就不用再登录了,第二次访问直接就可以登录进去

1.3、Cookie

1.cookie中常用属性的解释

  • Name:这个是cookie的名字
  • Value:这个是cooke的值
  • path:这个定义了Web站点上可以访问该Cookie的目录
  • Expircs:这个值表示cookie的过期时间,也就是有效值,cookic在这个值之前都有效。
  • size:这个表示cookic的大小

2.Cookie的Http传输

Cookie的Http传输 我们会在接下来的例子中进行抓包展示

3.Cookie的生命周期

cookie有2种存储方式,一种是会话性,一种是持久性

  • 会话性:如果cookie为会话性,那么cookie仅会保存在客户端的内存中,当我们关闭客服端时cookie也就失效了
  • 持久性:如果cookie为持久性,那么cookie会保存在用户的硬盘中,直至生存期结束或者用户主动将其销毁。

cookie我们是可以进行设置的,我们可以人为设置cookie的有效时间,什么时候创建,什么时候销毀。

4.cookie 使用的常见方法

java中Cookie对象的方法进行讲解

  • new Cookie(String name, String value):创建一个Cookie对象,必须传入cookie的名字和cookic的值
  • setValue():得到cookie保存的值
  • getName():获取cookie的名字
  • setMaxAge(int expiry):设置cookie的有效期,默认为-1。这个如果设置负数,表示客服端关闭,cookie就会删除。0表示马上删除。正数表示有效时间,单位是秒
  • setPath(String uri):设置cookie的作用域

HttpServletRequest和Http ServletResponse对Cookie进行操作的常见方法

  • response.addCookie(Cookie cookie):将cookie给客户端进行保存
  • resquest.getCookies0:得到客服端传过来的所有cookie对象

这张图是客户端携带Cookie访问服务器的流程图

1.3.1、用代码实现保存用户上一次访问的时间
  1. 从请求中拿到cookie信息

  2. 服务端响应给客户端cookie

//保存用户上一次访问的时间

public class CookieDemon01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器告诉你你来的时间,把这个时间封装为一个信件,你下次来,我就知道你来了


        //解决中文乱码,这里解决乱码需要根据实际情况自己进行调试
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("gbk");

        PrintWriter out = resp.getWriter();

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

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

            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字

               if( cookie.getName().equals("LastLogTime")){
                   //获取cookie的值

                   long lastLogTime = Long.parseLong(cookie.getValue());
                   Date date = new Date(lastLogTime);
                   out.write(date.toLocaleString());

               }
            }
            
        }else {
            out.write("这是您第一次访问本站");
        }
        
        //服务器给客户端响应一个cookie

        Cookie cookie = new Cookie("LastLogTime", System.currentTimeMillis()+"");
        //设置cookie有效期为一天(浏览器关闭cookie还存在一天)
        cookie.setMaxAge(24*60*60);

        resp.addCookie(cookie);

        
    }

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

3.注册Servlet

 <servlet>
    <servlet-name>CookieDemo01</servlet-name>
    <servlet-class>com.qid.servlet.CookieDemon01</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>CookieDemo01</servlet-name>
    <url-pattern>/c1</url-pattern>

4.测试访问

第一次访问

第二次访问

接下来我们抓包查看Cookie的Http传输

注:cookie一般会保存在本地的用户目录下AppData ,浏览器只会携带在当前请求的URL中包含了改cookie中path值的cookie

了解一下:
一个网站cookie是否存在上限?

  • 一个cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • cookie大小上限为4kb
  • 300个cookie大约为浏览器上限
1.3.2、删除cookie:
  • 不设置有效期,关闭浏览器,自动失效

  • 设置有效期为0

    public class CookieDemon02 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       
            //创建一个cookie.名字必须和要删除的名字一致
            Cookie cookie = new Cookie("LastLogTime", System.currentTimeMillis()+"");
            //有限期为0
            cookie.setMaxAge(0);
    
            resp.addCookie(cookie);
            
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
1.3.3、中文传输数据乱码问题

这里再用上面记录访问时间的例子说一下传输中文数据的问题:

如果一直中文传输数据乱码,可以尝试以下代码:

编码解码

//编码
Cookie cookie = new Cookie("name", URLEncoder.encode("张三","utf-8"));
 //解码
 out.write( URLDecoder.decode(cookie.getValue(),"utf-8"));

整体代码:


//中文数据传递

public class CookieDemon03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //解决中文乱码
        req.setCharacterEncoding("utf-16");
        resp.setCharacterEncoding("utf-16");
        //cookie,服务器端从客户端获取
        Cookie[] cookies = req.getCookies();//返回数组说明cookie可能存在多个


        PrintWriter out = resp.getWriter();

        //判断cookie是否存在
        if (cookies != null) {
            //如果存在怎么办
            out.write("您的名字是:");

            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字

                if( cookie.getName().equals("name")){
                    //获取cookie的值
                    System.out.println(cookie.getValue());
                   //解码
                    out.write( URLDecoder.decode(cookie.getValue(),"utf-8"));

                }
            }

        }else {
            out.write("这是您第一次访问本站");
        }
        //编码
        Cookie cookie = new Cookie("name", URLEncoder.encode("张三","utf-8"));
        resp.addCookie(cookie);
    }

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

注册servlet后测试结果

1.4、Session(重点)

1.4.1、Session的概念

1.什么是session

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

2.Session的常用方法

  • request.getSession():创建(第一次调用)或获取Session会话对象
  • isNew():判断当前Session会话是否是新创建出来的
  • getId():得到Session的会话ID
  • setAttribute():往Session中保存数据
  • getAttribute():获取Session域中的数据

3.Session的生命周期

  • 手动注销:session.invalidate();

  • 自动注销:在web.xml 中配置

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

4.session应用:

  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将它保存在Session中

下面这张图是服务器登记session,客户端用sessionID访问的流程图

####1.4.2、具体使用session

1.保存数据:

  • Person.java
  • SessionDemon01(设置信息)
  • SessionDemon02(得到信息)
public class Person {

    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class SessionDemon01 extends HttpServlet {

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

        //解决乱码问题
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("gbk");
        resp.setContentType("text/html;charset = gbk");

        //得到Session

        HttpSession session = req.getSession();

        //给Session中存东西
        session.setAttribute("name",new Person("李四",18));


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

        //判断session是不是新创建的
        if(session.isNew()){
            resp.getWriter().write("session创建成功,id:"+sessionId);
        }else {
            resp.getWriter().write("session已经在服务器中存在了,id:"+sessionId);
        }


        //Session创建的时候做了什么事情
//        Cookie cookie = new Cookie("JSESSIONID",sessionId);
//        resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
public class SessionDemon02 extends HttpServlet {

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

        //解决乱码问题
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("gbk");
        resp.setContentType("text/html;charset = gbk");

        //得到Session

        HttpSession session = req.getSession();
        Person person = (Person) session.getAttribute("name");
        resp.getWriter().write(person.toString());
        System.out.println(person.toString());


    }

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

注册Servlet测试访问
(1)访问设置信息s1

(2)访问得到信息s2

2.会话过期

  • 手动

    public class SessionDemon03 extends HttpServlet {
    
            //注销,移除
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            HttpSession session = req.getSession();
            session.removeAttribute("name");
            //手动注销session
            session.invalidate();//一旦注销会重新产生一个sessionId
            
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
  • 自动

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

最后我们再回到刚开始的问题,一个网站怎么证明你来过呢?

思考 : Session和Cookie的区别

①cookie可以存储在浏览器或者本地,Session只能存在服务器
②session能够存储任意的java对象,cookie 只能存储String 类型的对象
③Session比tCookie更具有安全性(Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)
④Session占用服务器性能,Session过多,增加服务器压力
⑤单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制和服务器的

到这里关于Cookie与Session的知识就结束啦≧ω≦,希望对大家有所帮助!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaWeb中的Cookie和Session是用于在服务器和客户端之存储和传递数据的机制。 Cookie是在客户端(浏览器)保存少量数据的文本文件,它由服务器发送给浏览器,并在浏览器下一次向同一服务器发送请求时被浏览器携带过去。Cookie可以用于实现用户认证、记住登录状态、记录用户行为等功能。在JavaWeb中,可以使用`javax.servlet.http.Cookie`类来创建和设置Cookie。 Session是在服务器端存储用户信息的一种机制。当用户第一次访问服务器时,服务器会为该用户创建一个唯一的会话标识(Session ID),并将该标识保存在Cookie中发送给客户端。客户端在后续的请求中会带上这个Session ID,服务器通过这个Session ID可以获取到对应的会话信息。在JavaWeb中,可以使用`javax.servlet.http.HttpSession`类来创建、获取和操作Session。 Cookie和Session的区别主要有: 1. 存储位置:Cookie存储在客户端,Session存储在服务器端。 2. 容量限制:Cookie有大小限制,一般为4KB左右;Session可以存储较大量的数据。 3. 安全性:Cookie数据存储在客户端,容易被恶意篡改;Session数据存储在服务器端,相对较安全。 4. 生命周期:Cookie可以设置过期时间,可以长期保存在客户端;Session默认情况下会在一段时间内保持活跃,超过时间会被销毁。 在实际应用中,Cookie和Session常常结合使用,通过Cookie存储Session ID来实现用户的身份验证和状态管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鹤鸣呦呦、、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值