【Cookie】【Session】【学习笔记】寒假javaweb学习之旅2.0

本文深入探讨了Cookie和Session在Web开发中的应用,包括它们的创建、获取、修改、生命周期管理和安全性。通过实例代码展示了如何使用Cookie进行用户免登录功能,并详细解释了Session的创建、获取、数据存储和超时控制。此外,还揭示了浏览器与Session之间的关联机制,强调了Cookie在Session实现中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知,开学上网课,等于没开学,所以现在,还是寒假😁,所以👴的寒假还没有结束捏🤗

🤗Cookie

1、什么是Cookie

1、Cookie 翻译过来是饼干的意思。
2、Cookie 是服务器通知客户端保存键值对的一种技术。
3、客户端有了Cookie后,每次请求都发送给服务器。
4、每个Cookie的大小不能超过4kb

2、如何创建Cookie

为了方便展示,我们使用,视频课程提供好的cookie.html

在这里插入图片描述

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="pragma" content="no-cache" />
        <meta http-equiv="cache-control" content="no-cache" />
        <meta http-equiv="Expires" content="0" />
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Cookie</title>
        <base href="http://localhost:8080/cookie_session/">
        <style type="text/css">

            ul li {
                list-style: none;
            }

        </style>
    </head>
    <body>
        <iframe name="target" width="500" height="500" style="float: left;"></iframe>
        <div style="float: left;">
            <ul>
                <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
                <li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
                <li><a href="cookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li>
                <li>Cookie的存活周期</li>
                <li>
                    <ul>
                        <li><a href="cookieServlet?action=defaultLife" target="target">Cookie的默认存活时间(会话)</a></li>
                        <li><a href="cookieServlet?action=deleteNow" target="target">Cookie立即删除</a></li>
                        <li><a href="cookieServlet?action=life3600" target="target">Cookie存活3600秒(1小时)</a></li>
                    </ul>
                </li>
                <li><a href="cookieServlet?action=testPath" target="target">Cookie的路径设置</a></li>
                <li><a href="" target="target">Cookie的用户免登录练习</a></li>
            </ul>
        </div>
    </body>
</html>

图解

在这里插入图片描述

通过Set-Cookie通知客户端保存Cookie

在这里插入图片描述

代码实现

这里我们继承的是书城项目的BaseServlet,因为可以偷个懒😁

public class CookieServlet extends BaseServlet{

    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1、创建Cookie对象
        Cookie cookie = new Cookie("k1","v1");
        // 2、通知客户端保存Cookie
        resp.addCookie(cookie);

        resp.getWriter().write("创建Cookie成功");

    }
}

BaseServlet

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

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 解决post请求中文乱码问题
        // 一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        // 解决响应中文乱码问题
        response.setContentType("text/html; charset=UTF-8");

        String action = request.getParameter("action");

        try {

            // 获取action业务鉴别字符串,获取相应的业务 方法反射对象
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            // 调用目标业务 方法
            method.invoke(this,request,response);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

配置XML

<servlet>
    <servlet-name>CookieServlet</servlet-name>
    <servlet-class>com.flzj.servlet.CookieServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CookieServlet</servlet-name>
    <url-pattern>/cookieServlet</url-pattern>
</servlet-mapping>

效果展示

在这里插入图片描述

3、服务器如何获取Cookie

服务器获取客户端的Cookie只需要一行代码: request.getCookies();会返回Cookie[]

在这里插入图片描述

图解

在这里插入图片描述

代码实现

Cookie.html的a标签,添加跳转到这个程序

<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>

CookieServlet 完善功能

// 服务端获取cookie
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie[] cookies = req.getCookies();
    for (Cookie cookie : cookies) {
        // getName方法返回cookie的key (名)
        // getValue. 方法返回cookie的value值
        resp.getWriter().write("Cookie[" + cookie.getName() + " = " + cookie.getValue() + "]" + "<br/>" );
    }
}

如何获取指定的key捏

for循环遍历,获取,这里我们封装到util/CookieUtils.java

public class CookieUtils {
    public static Cookie findCookie(String name,Cookie[] cookies){
        if(name == null || cookies.length == 0 || cookies == null){
            return null;
        }
        for (Cookie cookie : cookies) {
            if(cookie.getName().equals(name)){
                return cookie;
            }
        }
        return null;
    }
}

测试效果

在这里插入图片描述

resp.getWriter().write(CookieUtils.findCookie("key1",cookies) == null ? "查找成功" : "查找失败" );

4、Cookie值的修改

方案一

1、先创建一一个要修改的同名的Cookie对象
2、在构造器,同时赋于新的Cookie值
3、调用response.addCookie(Cookie);

在这里插入图片描述

// 修改Cookie
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getWriter().write("调用updateCookie方法");
    //              方案一
    //        1、先创建一个要修改的同名的Cookie对象
    //        2、在构造器,同时赋于新的Cookie值。
    Cookie cookie = new Cookie("k1","newV1");
    //        3、调用response.addCookie( Cookie );
    resp.addCookie(cookie);
    resp.getWriter().write("k1已修改好");
}

这里小小解释下第二步,客户端会看一下,有没有这个Cookie值,没有就创建,有就修改

在这里插入图片描述

方案二

1、先查找到需要修改的Cookie对象
2、调用setValue()方法赋于新的Cookie值
3、调用response.addCookie()通知客户端保存修改

在这里插入图片描述

// 修改Cookie
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getWriter().write("调用updateCookie方法");
    //              方案二
    //        1、先查找到需要修改的Cookie对象
    Cookie cookie = CookieUtils.findCookie("k2",req.getCookies());
    //        2、调用setValue()方法赋于新的Cookie值。
    if(cookie != null) {
        cookie.setValue("newV2");
        //        3、调用response.addCookie()通知客户端保存修改
        resp.addCookie(cookie);
    }
    resp.getWriter().write("k2已修改好");
}

5、Cookie的存活设置

Cookie的生命控制指的是如何管理Cookie什么时候被销毁(删除)

setMaxAge()
正数,表示在指定的秒数后过期
负数,表示浏览器一关, Cookie就会被删除(默认值是-1)
零,表示马上删除Cookie

设置默认时间

cookie.html 里,a标签路径改改

<li><a href="cookieServlet?action=defaultLife" target="target">Cookie的默认存活时间(会话)</a></li>

CookiServlet 多写个defaultLife()方法

// 设置默认时间
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie cookie = new Cookie("defaultLife","defaultLife");
    cookie.setMaxAge(-1); // 设置存活时间
    resp.addCookie(cookie);
}

立刻删除Cookie

// 设置妙删时间
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie cookie = new Cookie("defaultNow","defaultNow");
    cookie.setMaxAge(0); // 设置存活时间
    resp.addCookie(cookie);
    resp.getWriter().write("立即删除Cookie成功");
}

设置一小时后删除

// 设置一小时删除
protected void deleteHour(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie cookie = new Cookie("k3600","v3600");
    cookie.setMaxAge(60*60);
    resp.getWriter().write("设置生命周期为一小时");
}

在这里插入图片描述

6、Cookie的path属性

Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器。哪些不发。
path属性是通过请求的地址来进行有效的过滤。

举例

CookieA path=/工程路径
CookieB path=/工程路径/abd

请求地址如下:
http://ip:port/工程路径/a.html
CookieA发送
CookieB不发送

http://ip:port/工程路径/abc/a.html
CookieA发送
CookieB发送

在这里插入图片描述

setPath()方法

设置Cookie的path

protected void textPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie cookie1 = new Cookie("path1", "path1");
    Cookie cookie2 = new Cookie("path2", "path2");

    // /工程路径/
    cookie1.setPath(req.getContextPath());
    // /工程路径/abc
    cookie2.setPath(req.getContextPath() + "/abc");


    resp.addCookie(cookie1);
    resp.addCookie(cookie2);
}

在这里插入图片描述

path2因为不满足路径,所以没有出现

7、练习-免用户名登入

在这里插入图片描述

图解

在这里插入图片描述

代码实现

登入页面login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
        <head>
            <title>登入界面</title>
        </head>
        <body>
            <form action="" method="get">
                用户名: <input type="text" name="username" value="${cookie.username.value}" placeholder="请输入用户名"><br/>
                密码: <input type="password" name="password" placeholder="请输入密码" ><br/>
                <input type="submit" value="提交">
            </form>
        </body>
    </html>

LoginServlet

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    if("flzj_kl".equals(username) && "123456".equals(password)){
        System.out.println("登入成功");
        Cookie cookie = new Cookie("username", username);
        cookie.setMaxAge(60 * 60);  // 一小时后Cookie失效
        response.addCookie(cookie);
        //设置服务器的字符集为UTF-8
        response.setCharacterEncoding("UTF-8");	//只加上会乱码
        //通过响应头,设置浏览器使用UTF-8
        response.setHeader("Content-Type","text/html; charset=UTF-8");
        response.getWriter().write("登入成功");
    }else{
        System.out.println("登入失败");
    }
}

🤗Session

1、什么是Session

1、Session 就一个接口( HttpSession)
2、session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都有自己的一个Session 会话。
4、Session 会话中,我们经常用来保存用户登录之后的信息。

2、Session创建和获取

request.getSession()

创建和获取的API是一样的

第一次调用是:创建Session会话

之后调用都是,获取前面创建好的Session会话对象。

isNew()

判断到底是不是刚创建出来的(新的)

true表示刚刚创建,false表示获取之前创建

getId()

每个会话都有一个身份证号。也就是ID值。而且这个1D是唯一的。getld()得到Session的会话id值。

测试效果

在这里插入图片描述

为了方便展示,我们用了课程自带的session.html

在这里插入图片描述

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="pragma" content="no-cache" />
        <meta http-equiv="cache-control" content="no-cache" />
        <meta http-equiv="Expires" content="0" />
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Session</title>
        <base href="http://localhost:8080/13_cookie_session/">
        <style type="text/css">

            ul li {
                list-style: none;
            }

        </style>
    </head>
    <body>
        <iframe name="target" width="500" height="500" style="float: left;"></iframe>
        <div style="float: left;">
            <ul>
                <li><a href="" target="target">Session的创建和获取(id号、是否为新创建)</a></li>
                <li><a href="" target="target">Session域数据的存储</a></li>
                <li><a href="" target="target">Session域数据的获取</a></li>
                <li>Session的存活</li>
                <li>
                    <ul>
                        <li><a href="" target="target">Session的默认超时及配置</a></li>
                        <li><a href="" target="target">Session3秒超时销毁</a></li>
                        <li><a href="" target="target">Session马上销毁</a></li>
                    </ul>
                </li>
                <li><a href="" target="target">浏览器和Session绑定的原理</a></li>
            </ul>
        </div>
    </body>
</html>

修改a标签的链接

<li><a href="sessionServlet?action=createOrGetSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>

编写SessionServlet类的createOrGetSession()方法

protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 创建和获取Session对象
    HttpSession session = req.getSession();
    // 判断Session对象是否是新创建出来的
    boolean isNew = session.isNew();
    // 获取Session会话唯一标识id
    String id = session.getId();
    // 输出出到页面上看看把
    resp.getWriter().write("得到的Session,它的id是" + id + "<br/>");
    resp.getWriter().write("判断这个Session是否是新创建的" + isNew + "<br/>");
}

3、Session域的存取

getAttribute()方法和setAttribute()方法

代码测试

在这里插入图片描述

改改a标签

<li><a href="sessionServlet?action=setAttribute" target="target">Session域数据的存储</a></li>
    <li><a href="sessionServlet?action=getAttribute" target="target">Session域数据的获取</a></li>	

完成setAttribute和getAttribute方法

protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.getSession().setAttribute("k1","v1");
    resp.getWriter().write("已成功向Session域中保存数据");
}

protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Object attribute = req.getSession().getAttribute("k1");
    resp.getWriter().write("从Session域中取出k1的值是:" + attribute );
}

4、Session超时的控制

关于生命控制的API

API作用
public void setMaxInactiveInterval(int interval)设置Session的超时时间(以秒为单位), 超过指定的时长,Session就会被销毁,interval为负数表示永不超时(极少使用)
public int getMaxInactiveInterval()获取Session的超时时长
public void invalidate()让当前Session会话马上超时无效

Session 默认的时长

30 分钟,以下是证明

我们写代码自己也可以看看

在这里插入图片描述

<li><a href="sessionServlet?action=defaultLife" target="target">Session的默认超时及配置</a></li>
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
    resp.getWriter().write("Session默认的时长是" + maxInactiveInterval);
}

因为在Tomcat服务器的配置文件web.xml中(CATALINA_BASE/config/web.xml)默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为: 30分钟

在这里插入图片描述

如果你希望你的web工程,默认的Session的超时时长为,其他时长。你可以在你自己的web.xml配置文件中做
以上相同的配置。就可以修改你的web工程所有Seession的默认超时时长。下图,自己修改成20分钟

在这里插入图片描述

修改个别Session的超时时长

通过setMaxInactiveInterval()方法

在这里插入图片描述

<li><a href="sessionServlet?action=life3" target="target">Session3秒超时销毁</a></li>
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.getSession().setMaxInactiveInterval(3);
    resp.getWriter().write("当前Session设置为3秒后超时");
}

视频里,老师疯狂点击,a标签,导致3秒还删不掉,这是怎么回是捏?解释,如下图

在这里插入图片描述

Session 的马上销毁

在这里插入图片描述

<li><a href="sessionServlet?action=deleteNow" target="target">Session马上销毁</a></li>
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 获取Session对象
    HttpSession session = req.getSession();
    // 让Session会话马上超时
    session.invalidate();

    resp.getWriter().write("Session已设置为超时(无效)");
}

5、浏览器和Session之间关联的技术内幕

Session技术,底层其实是基于Cookie技术来实现的。

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值