JavaWeb系列十一: Web 开发会话技术Cookie

在这里插入图片描述

基本介绍

1.什么是会话?
会话可简单地理解为: 用户开启一个浏览器, 点击多个超链接, 访问服务器多个web资源, 然后关闭浏览器, 整个过程称之为一个会话.

2.会话过程中要解决哪些问题?
1)每个用户在使用浏览器与服务器进行会话的过程中, 不可避免地会产生一些数据, 服务器要想办法帮每个用户保存这些数据.
2)例如: 多个用户点击超链接通过一个servlet各自购买了一个商品, 服务器应该想办法把每一个用户购买的商品保存在各自的地方, 以便于这些用户点结账servlet时, 结账servlet可以得到用户各自购买的商品为用户结账.

会话的两种技术

cookie, Session.

cookie有什么用?

1.大家在访问某个网站的时候, 是否能看到提示你上次登陆网站的时间, 而且要注意的是不同用户上次登陆的时间肯定是不一样的, 这是怎么实现的?

在这里插入图片描述

2.大家访问某个购物网站的时候, 是否能看到提示你曾经浏览过的商品, 不同用户浏览的商品肯定不一样, 这是怎么实现的?

在这里插入图片描述

3.解决之道-cookie技术
cookie(小甜饼)是客户端技术, 服务器把每个用户的数据以cookie的形式写给用户各自的浏览器. 当用户使用浏览器再去访问服务器中的web资源时, 就会带着各自的数据去. 这样, web资源处理的就是用户各自的数据了.

在这里插入图片描述

cookie介绍

二说cookie

1.cookie是服务器在客户端保存的用户信息, 比如登录名, 浏览历史等, 就可以以cookie的方式保存.

2.cookie信息就像是小甜饼(cookie 中文)一样, 数据量并不大, 服务器端在需要的时候可以从客户端/浏览器(通过http协议)读取.

3.这个就是edge浏览器里的cookie信息.

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

在这里插入图片描述

4.再次强调, cookie数据是保存在浏览器的.

cookie可以用来干啥

1.保存上次登陆时间等信息.

2.保存用户名, 密码, 在一定时间内不用重新登陆.

3.网站的个性化, 比如定制网站的服务, 内容.

cookie常用方法

1.cookie有点像一张表(K-V), 分两列, 一个是名字, 一个是值, 数据类型都是String, 都是小量的数据, 如图
在这里插入图片描述

2.如果创建一个cookie(在服务端创建的)
cookie cookie = new cookie(String name, String val);
cookie.setMaxAge();//保存时间

3.如何将一个cookie添加到客户端
response.addcookie(cookie);

4.如何读取cookie(在服务端读取cookie信息)
request.getcookies();

cookie底层实现机制-创建和读取cookie

需求: 演示Cookie底层实现机制, 创建和读取Cookie.

代码实现
1.新建java项目 cookie-session

2.引入servlet-api.jar

3.参考 IDEA 2022.3开发JavaWeb工程

4.创建src/com/zzw/cookie/CreateCookie.java

/**
 * 演示如何创建cookie,并保存到浏览器
 */
public class CreateCookie extends HttpServlet {
   
   
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        System.out.println("CreateCookie doPost 被调用...");
        //1.创建一个Cookie对象
        // username是该cookie的名字,是唯一的,可以理解为key; zzw 是该cookie的值
        // 可以创建多个Cookie对象,这里只创建了一个. 这时cookie在服务器端, 还没有在浏览器端
        Cookie username = new Cookie("username", "zzw");
        Cookie email = new Cookie("email", "[email protected]");
        //2.将cookie发送给浏览器, 让浏览器将该cookie保存
        response.setContentType("text/html;charset=utf-8");
        response.addCookie(username);
        response.addCookie(email);

        PrintWriter writer = response.getWriter();
        writer.print("<h1>创建cookie成功!</h1>");
        writer.flush();
        writer.close();
    }
}

配置web.xml

<servlet>
    <servlet-name>CreateCookie</servlet-name>
    <servlet-class>com.zzw.cookie.CreateCookie</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CreateCookie</servlet-name>
    <url-pattern>/createCookie</url-pattern>
</servlet-mapping>

5.浏览器访问 https://localhost:8080/cookie_session/createCookie, 使用浏览器抓包分析 创建 Cookie 的底层机制
在这里插入图片描述
在这里插入图片描述

6.创建src/com/zzw/cookie/ReadCookie.java

public class ReadCookies extends HttpServlet {
   
   
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        doPost(request, response);
    }

    /*读取浏览器/客户端发送来的cookie信息*/
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        System.out.println("ReadCookies 被调用...");
        //1.通过request对象获取cookie信息
        Cookie[] cookies = request.getCookies();
        //2.遍历cookies信息,先判断一下
        if (cookies != null && cookies.length != 0) {
   
   
            for (Cookie cookie : cookies) {
   
   
                System.out.println("cookie: 名字=" + cookie.getName() + ", 值=" + cookie.getValue());
            }
        }
        //3.给浏览器返回信息
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print("<h1>读取cookies信息成功</h1>");
        writer.flush();
        writer.close();
    }
}

配置web.xml

<servlet>
    <servlet-name>ReadCookie</servlet-name>
    <servlet-class>com.zzw.cookie.ReadCookie</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ReadCookie</servlet-name>
    <url-pattern>/readCookie</url-pattern>
</servlet-mapping>

7.浏览器访问 https://localhost:8080/cookie_session/readCookie, 使用浏览器抓包分析 创建 Cookie 的底层机制

在这里插入图片描述

8.不同会话, jsessionid不同.

1.提示: 访问Servlet(比如 http://localhost:8080/cs/updatecookie)不会生成JSESSIONID, 访问http://localhost:8080/cs/才会生成
2.要关闭浏览器再开一个新的, 才能产生一个新的session会话

在这里插入图片描述

应用实例-读取指定cookie和修改cookie

1.创建src/com/zzw/cookie/utils/CookieUtils.java

public class CookieUtils {
   
   
    //编写一个方法, 返回指定名字的cookie
    public static Cookie readCookieByName(String name, Cookie[] cookies) {
   
   
        //判断输入的参数格式是否正确
        if (name == null || "".equals(name) || cookies == null || cookies.length == 0) {
   
   
            return null;
        }
        //遍历cookie数组
        for (Cookie cookie : cookies) {
   
   
            if (name.equals
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

~ 小团子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值