javaweb--session、cookie

本文详细解析了Cookie和Session在网站会话保存中的作用,通过实例展示了如何使用Cookie保存用户上一次访问时间,以及如何在session中存储和获取数据。同时涵盖了删除Cookie的方法和session的注销操作,突出了它们之间的区别,适合理解会话管理的开发者阅读。
摘要由CSDN通过智能技术生成


Cookie :小饼干

Session :会话

会话

会话

用户打开浏览器,点击很多链接,访问多个web资源,关闭浏览器,这个过程叫做会话

有状态会话

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

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

保存会话的两种技术

cookie

  • 客户端技术

session

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

常见案例 :网站第一次登陆之后,第二次就不需要登陆了,直接就是登陆状态了

cookie

案例 :
保存用户上一次访问的时间

1、编写 servlet

import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class CookieDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();
        // 服务器从客户端获取 cookie
        Cookie[] cookies = req.getCookies();//这里返回的是数组,说明cookie可以是多个
        // 判断 cookie 是否存在
        if(cookies!=null){
            //如果cookie存在
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie =cookies[i];
                //获取cookie的名字
                if(cookie.getName().equals("lastLoginTime")){
                    out.println("上一次访问的时间为 :");
                    //获取cookie中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }else{
                    //因为浏览器中会默认带有cookie,不只是有我们设置的这一个
                    out.println("这是你第一次访问!!!");
                }
            }
        }else{
            out.println("这是你第一次访问!!!");
        }
        //服务器响应给浏览器一个cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
        //设置 cookie 的有效期     24*60*60 为一天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
    }

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

2、配置 web.xml

<servlet>
    <servlet-name>cookie1</servlet-name>
    <servlet-class>com.hkp.cookie.CookieDemo</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>cookie1</servlet-name>
    <url-pattern>/cookie1</url-pattern>
</servlet-mapping>

3、启动测试

在这里插入图片描述
在这里插入图片描述

删除cookie
  • 如果不设置 cookie 的有效期,关闭浏览器则自动删除cookie
  • 将 cookie 的有效期设置为0,每次访问都会将cookie 删除

案例 :

1、编写 servlet

import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class CookieDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //方式一
//        //获取浏览器中的cookie
//        Cookie[] cookies = req.getCookies();
//        for (int i = 0; i < cookies.length; i++) {
//            if(cookies[i].getName().equals("lastLoginTime")){
//                //设置 cookie 的有效期    0 即为删除此 cookie
//                cookies[i].setMaxAge(0);
//                resp.addCookie(cookies[i]);
//            }
//        }

        //方式二
        //创建一个cookie,名字必须和要删除的cookie名字一样
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        //设置 cookie 的有效期    0 即为删除此 cookie
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }

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

2、配置 web.xml

<servlet>
    <servlet-name>cookie2</servlet-name>
    <servlet-class>com.hkp.cookie.CookieDemo2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>cookie2</servlet-name>
    <url-pattern>/cookie2</url-pattern>
</servlet-mapping>

3、启动测试

在这里插入图片描述

一个网站 cookie 是否存在上限?
  • 一个cookie只能保存一个信息
  • 一个 服务器 可以给 浏览器发多个 cookie,但服务器最多存放20个cookie
  • cookie大小有限制 – 4kb
  • 浏览器 cookie的上限 300 个

session (重点)

什么是 session ?

  • 服务器会给每一个用户(浏览器)创建一个 session 对象
  • 一个session独占一个浏览器,只要浏览器没关,session就永远存在
  • 用户登录后,可以访问整个网站 --> 保存用户的信息
案例
往session中存东西

1、编写 servlet

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

public class SessionDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();
        //获取session
        HttpSession session = req.getSession();
        //往session 中存东西
        session.setAttribute("name","测试");
        //获取 sessionID,就是页面中的 JSESSIONID
        String sessionId = session.getId();
        //判断session是否是新创建的
        if(session.isNew()){
            out.println("session 是新创建的"+sessionId);
        }else{
            out.println("session 已经存在了"+sessionId);
        }
    }

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

2、配置 web.xml

<servlet>
    <servlet-name>session1</servlet-name>
    <servlet-class>com.hkp.session.SessionDemo</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>session1</servlet-name>
    <url-pattern>/session1</url-pattern>
</servlet-mapping>

3、测试

在这里插入图片描述

在另外一个servlet 中获取 session

1、编写 servlet

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        //获取session
        HttpSession session = req.getSession();
        //获取session的值
        String name = (String)session.getAttribute("name");
        //将该值输出到网页
        resp.getWriter().println(name);
    }

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

2、配置 web.xml

<servlet>
    <servlet-name>session2</servlet-name>
    <servlet-class>com.hkp.session.SessionDemo2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>session2</servlet-name>
    <url-pattern>/session2</url-pattern>
</servlet-mapping>

3、测试

在这里插入图片描述

移除session

1、编写servlet

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取session
        HttpSession session = req.getSession();
        //将session中的某个值移除
        session.removeAttribute("name");
        //注销session,相当于关闭浏览器(改变了JSESSIONID的值,相当于刷新了一次页面)
        session.invalidate();
    }

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

2、配置 web.xml

<servlet>
    <servlet-name>session3</servlet-name>
    <servlet-class>com.hkp.session.SessionDemo3</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>session3</servlet-name>
    <url-pattern>/session3</url-pattern>
</servlet-mapping>

3、测试

不加 session.invalidate();

在这里插入图片描述在这里插入图片描述

加上 session.invalidate(); 改变了JSESSIONID的值,相当于刷新了一次页面

在这里插入图片描述
在这里插入图片描述

注销session

方式一 :手动移除session,测试效果见上面移除session的案例

在 servlet 中 使用session.invalidate();

方式二 :在web.xml 中配置session 的默认失效时间

1、配置web.xml

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

2、启动测试

在这里插入图片描述

一分钟后 :session id自动改变

在这里插入图片描述

session 和 cookie的区别 :

  1. cookie是把用户的数据写给用户的浏览器,浏览器中保存(可以保存多个)
  2. session把用户的数据写到用户独占 session 中,服务端保存(保存重要、常用信息,减少服务端资源浪费)
  3. session对象有服务端创建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值