JavaWeb 速通Cookie

简介: JavaWeb——会话技术 Cookie 内容分享。

目录

一、关于base标签

       1.引入 :

       2.介绍 :

       3.实例 :

       4.细节 :

二、Cookie的引入

       1.会话技术 :

           1° 什么是会话技术?

           2° 会话技术用于解决什么问题?

       2.Cookie介绍

           1° Cookie有什么用?

           2° Cookie通讯机制

三、Cookie的基本使用

       1.创建Cookie对象并保存到浏览器 :

       2.服务器端读取浏览器保存的Cookie :

四、Cookie的应用实例

       1.关于“JSESSIONID”的说明 :

       2.读取指定Cookie :

       3.修改Cookie :

五、Cookie的生命周期

       1.基本介绍 :

       2.setMaxAge(int expiry)方法 :

       3. 应用实例 :

六、Cookie有效路径

       1.规则 :

       2.应用实例 :

       3.cookie使用细节 :


一、关于base标签

       1.引入 :

               有两个html文件,位置如下 :

image.gif编辑

               demo1.html代码如下 :

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>demo1</title></head><body><ahref="d1/d2/demo2.html"target="_self">点我到demo2.html</a></body></html>

image.gif

              demo2.html代码如下 :

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>demo2</title></head><body><ahref="../../demo1.html">点我去demo1.html~</a></body></html>

image.gif

               运行效果如下GIF图 :

image.gif编辑

               1° 页面所有的相对路径,在默认情况下,都会参考当前浏览器地址栏的路径 http://IP:port/工程名/(也包含目录结构) + 资源来进行跳转。

                当Web工程中的文件数目较多时,频繁地使用相对路径会造成“工程路径复杂”的问题。

               解决方法——如果需要指定页面相对路径所参考的的路径,可以使用base标签来指定。

       2.介绍 :

        base标签是 HTML 语言中的基准网址标记,<base/>是一个单标签,位于网页头部文件的head标签内

       一个页面最多只能使用一个 base 元素,用来提供一个指定的默认目标,是一种表达路径和连接网址的标记。

       常见的URL路径形式分别有相对路径与绝对路径,如果 base 标签指定了目标,浏览器将通过这个目标来解析当前文档中的所有相对路径,包括的标签有(a, img, link, form

       浏览器解析时会在路径前加上base标签href属性中给的目标,使页面中的相对路径转换成绝对路径。

       <base/>标签常用属性有href和target。

       3.实例 :

               demo1.html代码如下 :

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>demo1</title><!-- base标签的href属性值最后必须添加斜杠/,否则无法拼接。Δ需要启动Tomcat服务!--><basehref="http://localhost:8080/WebPath/"/></head><body><ahref="d1/d2/demo2.html"target="_self">点我到demo2.html</a></body></html>

image.gif

               demo2.html代码如下 :

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>demo2</title><basehref="http://localhost:8080/WebPath/"/><!-- base标签的href属性值最后必须添加斜杠/,否则无法拼接。 --></head><body><ahref="demo1.html">点我去demo1.html~</a></body></html>

image.gif

               运行结果 :

image.gif编辑

       4.细节 :

       <base/>标签也可以应用于“请求转发”和“请求重定向”。PS : <base/>标签的href属性值最后加不加/,对实际作用效果影响很大。

        实际开发中,使用“绝对路径”。

       关于URL开头的"/",若/被服务器端解析,/会被解析成" /Web工程名/ "若/被浏览器端(客户端)解析,/会被解析成" http://IP[域名]:port/ "

           PS : 如果服务器端解析的URL开头没写/,默认隐含/;如果浏览器端解析的URL开头没有/,默认会以浏览器地址栏中的" http://IP[域名]:port/Web工程目录 "来和访问的资源进行拼接

        在JavaWeb中,URL路径最后带"/" 和 不带"/"是两回事;URL最后带/表示访问的是一个路径,URL最后不带/表示访问的是一个资源

        请求重定向中,resp.sendRedirect("URL"); 语句虽然是在服务器端被执行,但解析URL是在浏览器端进行的。PS : 推荐使用this.getServletContext.getContextPath()方法来动态地获取Web工程路径,可以使URL配置更加灵活。


二、Cookie的引入

       1.会话技术 :

           1° 什么是会话技术?

       会话可简单理解为:用户打开一个浏览器,点击多个超链接,访问Web服务器的多个web资源,然后关闭浏览器,整个过程称之为一个会话。会话是在浏览器端(客户端)和服务器端之间进行的。

           2° 会话技术用于解决什么问题?

       每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,服务器会设法为每个用户保存各自的这些数据。

       eg : 多个用户分别点击购物网站的超链接,通过一个购物servlet各自购买了一个商品,服务器应该想办法把每一个用户购买的商品的信息保存在各自的地方,以便于这些用户点结账时,调用结帐servlet,结帐servlet 可以得到用户各自购买的商品信息为用户结帐。

       2.Cookie介绍

           1° Cookie有什么用?

       Cookie是客户端技术;服务器把每个用户的数据以cookie的形式写给用户各自的浏览器,当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

           2° Cookie通讯机制

               示意图如下 :

image.gif编辑

              1>Cookie是服务器在客户端保存的用户相关信息,比如登录名,浏览记录等非敏感信息, 就可以通过cookie方式来保存.

               2> Cookie信息数据量并不大,服务器端在需要的时候可以从客户端/浏览器读取(遵循HTTP协议;req.getCookies()方法)。浏览器向服务器发送HTTP请求时,会在请求包中自动携带当前服务器域名下对应的Cookie。再次注意,Cookie是保存在浏览器端的。


三、Cookie的基本使用

       1.创建Cookie对象并保存到浏览器 :

               CookieBaseServlet类代码如下 :

packageintro;
importjakarta.servlet.ServletException;
importjakarta.servlet.http.Cookie;
importjakarta.servlet.http.HttpServlet;
importjakarta.servlet.http.HttpServletRequest;
importjakarta.servlet.http.HttpServletResponse;
importjava.io.IOException;
importjava.io.PrintWriter;
/*** @author : Cyan_RA9* @version : 21.0*/publicclassCookieBaseServletextendsHttpServlet {
@OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
System.out.println("CookieBaseServlet's doPost is invoked");
//1.创建一个Cookie对象(key是Cookie的名字,唯一)//可以创建多个Cookie对象Cookiecookie=newCookie("username", "Cyan");
Cookiecookie2=newCookie("platform", "CSDN");
//2.将创建好的Cookie对象发送给浏览器,浏览器会将收到的Cookie信息进行保存resp.setContentType("text/html; charset=utf-8");
resp.addCookie(cookie);
resp.addCookie(cookie2);
PrintWriterwriter=resp.getWriter();
writer.print("<h1>创建Cookie成功,已保存!</h1>");
writer.flush();
writer.close();
    }
@OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
doPost(req, resp);
    }
}

image.gif

               web.xml配置文件如下 :

<?xmlversion="1.0" encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>CookieBaseServlet</servlet-name><servlet-class>intro.CookieBaseServlet</servlet-class></servlet><servlet-mapping><servlet-name>CookieBaseServlet</servlet-name><url-pattern>/cbServlet</url-pattern></servlet-mapping></web-app>

image.gif

               运行效果 : (如下GIF图)

image.gif编辑

               HTTP响应包分析 :

image.gif编辑

               浏览器端Cookie存储 :

image.gif编辑

       2.服务器端读取浏览器保存的Cookie :

               ReadCookiesServlet类代码如下 :

packageintro;
importjakarta.servlet.ServletException;
importjakarta.servlet.annotation.WebServlet;
importjakarta.servlet.http.Cookie;
importjakarta.servlet.http.HttpServlet;
importjakarta.servlet.http.HttpServletRequest;
importjakarta.servlet.http.HttpServletResponse;
importjava.io.IOException;
importjava.io.PrintWriter;
@WebServlet(urlPatterns={"/readServlet", "/read"})
publicclassReadCookiesServletextendsHttpServlet {
@OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
System.out.println("ReadCookiesServlet's doPost is invoked~\n");
//获取浏览器端保存的Cookie信息Cookie[] cookies=req.getCookies();
if (cookies!=null&&cookies.length!=0) {
for (Cookiecookie : cookies) {
System.out.println("cookie's name = "+cookie.getName() +",cookie's value = "+cookie.getValue());
            }
        }
//给浏览器回送消息resp.setContentType("text/html; charset=utf-8");
PrintWriterwriter=resp.getWriter();
writer.print("<h1>收到!</h1>");
writer.flush();
writer.close();
    }
@OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
doPost(req, resp);
    }
}

image.gif

               运行效果(如下GIF图 ) :

image.gif编辑

               通过抓包,可以找到HTTP请求包中的Cookie请求头,如下图所示 :

image.gif编辑


四、Cookie的应用实例

       1.关于“JSESSIONID”的说明 :

       浏览器保存的Cookie信息中,JSESSIONID用于唯一标识不同的会话;不同会话,JSESSIONID不同

       当浏览器向服务器发送HTTP请求时,服务器会从HTTP请求头的Cookie信息中找到JSESSIONID,根据JSESSIONID的值来判断当前会话的客户端是哪个。

       2.读取指定Cookie :

               先编写一个可以获取Cookie信息的工具类CookieUtils.

              CookieUtils类代码如下 :

packageinstance;
importjakarta.servlet.http.Cookie;
/*** readCookieByName方法 : 返回指定name的Cookie*/publicclassCookieUtils {
publicstaticCookiereadCookieByName(Stringname, Cookie[] cookies) {
if (null==name||"".equals(name) ||null==cookies||cookies.length==0) {
returnnull;
        }
for (Cookiecookie : cookies) {
if (name.equals(cookie.getName())) {
returncookie;
            }
        }
returnnull;
    }
}

image.gif

                编写一个测试类;ReadSpecificCookieServlet类代码如下 :

packageinstance;
importjakarta.servlet.ServletException;
importjakarta.servlet.annotation.WebServlet;
importjakarta.servlet.http.Cookie;
importjakarta.servlet.http.HttpServlet;
importjakarta.servlet.http.HttpServletRequest;
importjakarta.servlet.http.HttpServletResponse;
importjava.io.IOException;
importjava.io.PrintWriter;
@WebServlet(urlPatterns={"/readSpecificCookie"})
publicclassReadSpecificCookieServletextendsHttpServlet {
@OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
Cookiecookie=newCookie("color", "pink");
resp.addCookie(cookie);
Cookie[] cookies=req.getCookies();
Cookiecolor=CookieUtils.readCookieByName("color", cookies);
if (null!=color) {
System.out.println("Cookie's name = "+color.getName() +", Cookie's value = "+color.getValue());
        } else {
System.out.println("Can't find that Cookie with this specific name!");
        }
resp.setContentType("text/html; charset=utf-8");
PrintWriterwriter=resp.getWriter();
writer.print("<h1>The task of getting specific is completed~</h1>");
writer.flush();
writer.close();
    }
@OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
doPost(req, resp);
    }
}

image.gif

              运行效果如下 : (GIF)

image.gif编辑

       3.修改Cookie :

               修改浏览器端保存的Cookie信息有两种方式。

               方式一 : 新创建一个同名的Cookie对象,然后通过resp.addCookie(cookie); 方法,实现Cookie新值对旧值的覆盖

               方式二 : 先获取到要修改的Cookie对象,通过cookie.setValue("..."); 方法,修改Cookie的值,然后再通过resp.addCookie的方式,以HTTP响应的方式将修改后的Cookie打回给浏览器

               ModifyCookieServlet类代码如下 :

packageinstance;
importjakarta.servlet.ServletException;
importjakarta.servlet.annotation.WebServlet;
importjakarta.servlet.http.Cookie;
importjakarta.servlet.http.HttpServlet;
importjakarta.servlet.http.HttpServletRequest;
importjakarta.servlet.http.HttpServletResponse;
importjava.io.IOException;
importjava.io.PrintWriter;
@WebServlet(urlPatterns={"/modifyCookie"})
publicclassModifyCookieServletextendsHttpServlet {
@OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
//方式一 :Cookiecookie_username=newCookie("username", "Cyan_RA9");
if (cookie_username!=null) {
resp.addCookie(cookie_username);
        }
//方式二 :Cookie[] cookies=req.getCookies();
StringcookieName="color";
Cookiecookie=CookieUtils.readCookieByName(cookieName, cookies);
if (cookie!=null) {
cookie.setValue("bluish_green");    //Cookie信息中不能包含空格resp.addCookie(cookie);
        } else {
System.out.println("当前访问服务器端的浏览器,没有保存该Cookie信息!");
        }
//在服务器端遍历Cookiesfor (Cookiec : cookies) {
System.out.println("cookie's name = "+c.getName() +", cookie's value = "+c.getValue() +"\n");
        }
resp.setContentType("text/html; charset=utf-8");
PrintWriterwriter=resp.getWriter();
writer.print("<h1>The task of updating Cookie is completed~</h1>");
writer.flush();
writer.close();
    }
@OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
doPost(req, resp);
    }
}

image.gif

               运行效果 : (GIF) (请求头抓包时,手贱刷新了一下

image.gif编辑


五、Cookie的生命周期

       1.基本介绍 :

       Cookie的生命周期指的是如何管理Cookie的销毁,即Cookie什么时候被销毁(删除)。

       2.setMaxAge(int expiry)方法 :

       public void setMaxAge(int expiry) : 该方法可以设置cookie的最大生存时间,以秒为单位

       Δ注意事项 :

       expiry为正值,表示cookie将在经过该值对应的秒数后过期。即,该值是cookie过期的最大生存时间,而不是cookie 的当前生存时间。

       PS : cookie过期/失效,指的是浏览器在访问服务器时,HTTP请求头中不会携带过期的cookie信息浏览器根据cookie创建的时间,计时到expiry,就认为该cookie无效

       expiry为负值,表示cookie不会被持久存储,将在Web会话的浏览器退出时被删除。默认情况下,expiry = -1(会话级别的生命周期)。

       expiry = 0,表示令cookie立刻失效,立刻被"删除"。(销毁)

       3. 应用实例 :

               CookieServletLife类代码如下 :

packagelifetime;
importinstance.CookieUtils;
importjakarta.servlet.ServletException;
importjakarta.servlet.annotation.WebServlet;
importjakarta.servlet.http.Cookie;
importjakarta.servlet.http.HttpServlet;
importjakarta.servlet.http.HttpServletRequest;
importjakarta.servlet.http.HttpServletResponse;
importjava.io.IOException;
importjava.io.PrintWriter;
@WebServlet(urlPatterns={"cookieLife"})
publicclassCookieLifeServletextendsHttpServlet {
@OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
//1.创建测试的cookieCookienewCookie1=newCookie("test1", "haha");
CookienewCookie2=newCookie("test2", "NB");
//2.设置cookie生命周期newCookie1.setMaxAge(10);   //10s后🐔newCookie2.setMaxAge(0);    //直接🐔Cookie[] cookies=req.getCookies();
Cookietest1=CookieUtils.readCookieByName("test1", cookies);
Cookietest2=CookieUtils.readCookieByName("test2", cookies);
System.out.println("test1 = "+test1);
System.out.println("test2 = "+test2);
//3.别忘了将cookie信息发送给浏览器if (null!=test1) {
resp.addCookie(newCookie1);
        } else {
System.out.println("没有找到该cookie__test1.");
        }
if (null!=test2) {
resp.addCookie(newCookie2);
        } else {
System.out.println("没有找到该cookie__test2.");
        }
//4.回显信息给浏览器resp.setContentType("text/html; charset=utf-8");
PrintWriterwriter=resp.getWriter();
writer.print("<h1>The task of testing cookie's lifetime is completed~</h1>");
writer.flush();
writer.close();
    }
@OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
doPost(req, resp);
    }
}

image.gif

               运行效果 :(GIF)

image.gif编辑


六、Cookie有效路径

       1.规则 :

       Cookie有效路径,指的是浏览器端保存的Cookie的path属性。如下图所示 :

image.gif 编辑

       Cookie 的 path 属性可以有效的过滤哪些Cookie会被携带在HTTP请求头中发送给服务器,哪些不会。

       path属性是通过请求的URL来进行有效的过滤,规则如下——

       若cookie未设置path属性,默认是"/Application context",即Web工程路径

       当请求的URL是Web工程路径的子路径时,即比Web工程路径更具体的路径,eg : /Cookie_Demo/d1,也会携带父路径的Cookie信息。(集合的包含关系)

       cookie.setPath("......"); 方法用于设置该cookie的path属性。

       2.应用实例 :

               CookiePathServlet类代码如下 :

packagepath;
importinstance.CookieUtils;
importjakarta.servlet.ServletException;
importjakarta.servlet.annotation.WebServlet;
importjakarta.servlet.http.Cookie;
importjakarta.servlet.http.HttpServlet;
importjakarta.servlet.http.HttpServletRequest;
importjakarta.servlet.http.HttpServletResponse;
importjava.io.IOException;
importjava.io.PrintWriter;
/**若没有采用web.xml配置文件的方式配置URL,就一定不要忘记配置@WebServlet注解*/@WebServlet(urlPatterns={"/cookiePath"})
publicclassCookiePathServletextendsHttpServlet {
@OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
Cookiecookie1=newCookie("fruit", "grape");
/*也可以通过req.getContextPath来获取工程路径*/cookie1.setPath(req.getContextPath());
Cookiecookie2=newCookie("animal", "cat");
cookie2.setPath(req.getContextPath() +"/d1");
resp.addCookie(cookie1);
resp.addCookie(cookie2);
resp.setContentType("text/html; charset=utf-8");
PrintWriterwriter=resp.getWriter();
writer.print("<h1>Check the cookies inside the HTTP-request-bag.</h1>");
writer.flush();
writer.close();
    }
@OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException {
doPost(req, resp);
    }
}

image.gif

               运行效果 : (GIF)

image.gif编辑

       3.cookie使用细节 :

        一个Cookie只能标识一种信息,它至少含有一个标识该信息的NAME和VALUE。PS:Cookie的name和value都是String类型

        一个WEB站点可以给一个浏览器发送多个Cookie,一个浏览器也可以存储多个WEB站点提供的Cookie

        cookie的总数量没有限制,但是每个域名下的cookie数量和每个cookie的大小是有限制的(不同的浏览器一般限制不同,了解即可);总之一句话,Cookie不适合存放数据量大的信息

        注意,删除cookie时,path必须一致,否则不会删除成功

        可以通过 String string = URLEncoder.encode("string", "utf-8"); 方法来设置指定value的编码。然后再通过Cookie cookie = new Cookie("key", string); 来创建指定了value编码格式的Cookie对象。最后,通过resp.addCookie(cookie); 即可将cookie信息发送给浏览器。

           如果需要对中文Cookie进行解码,使用String value = URLDecoder.decode(value, "utf-8"); 方法。

目录
相关文章
|
存储
Javaweb | 状态管理:Session、Cookie
Javaweb | 状态管理:Session、Cookie
118 0
|
存储
12JavaWeb基础 - Cookie技术
12JavaWeb基础 - Cookie技术
87 0
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
218 1
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
857 0
|
存储 安全 Java
JavaWeb中的Session和Cookie
本文介绍了JavaWeb中的会话跟踪技术,主要讨论了Cookie和Session的概念、用途、设置与获取方法以及生命周期。Cookie是客户端技术,用于在用户浏览器中存储信息,通常用于保持用户登录状态,有效期可设置。Session则保存在服务器端,用于跟踪用户状态,例如登录信息,生命周期可通过设置最大不活动时间控制。两者之间的主要区别在于数据存储位置和安全性,Cookie数据在客户端,可能存在安全风险,而Session数据在服务器端,相对较安全但会占用服务器资源。
|
前端开发 API 数据安全/隐私保护
【JavaWeb】Cookie和Session解析
【1月更文挑战第26天】【JavaWeb】Cookie和Session解析
|
存储 API
14JavaWeb基础 - Cookie 与 Session API总结
14JavaWeb基础 - Cookie 与 Session API总结
78 0
|
存储 设计模式 JavaScript
掌握JavaWeb开发的必备技能:Servlet、JSP、Cookie、Session、EL、JSTL详解 ~~~~B站老杜--Servlet-JSP-课堂笔记(三)
当某个特殊的事件发生(特殊的事件发生其实就是某个时机到了。)之后,被web服务器自动调用。 思考一个业务场景
156 0
|
11月前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
397 57