(十三)Servlet教程——Servlet中Cookie的使用

news2024/12/23 17:55:07

 1.什么是Cookie

        Cookie意为甜饼,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器都支持Cookie。

        由于HTTP是一种无状态的协议,服务器仅从网络连接上无法知道客户身份。于是就客户端颁发一个通行证,无论谁访问都必须携带自己的通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

        Cookie实际上就是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再次请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

        查看某网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert(document.cookie)就可以了。JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容。

        比方我们现在浏览器中打开百度网站

        在浏览器输入框中输入javascript:alert(document.cookie),然后点击回车,该网站所有的Cookie就会显示在弹框中

        一般情况下网站会使用特数的方法将Cookie信息进行加密。

        Cookie功能需要浏览器的支持。如果浏览器不支持Cookie,或者把Cookie禁用,Cookie功能就会失效。不同的浏览器使用不同的方式保存Cookie。

2. 使用Cookie

        Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。通过request.getCookie()获取客户端提交的所有Cookie,通过response.addCookie(Cookie cookie)向客户端设置Cookie。

        Cookie对象使用key-value属性对的形式保存用户状态,key表示Cookie的名字,名字必须是唯一的;value是Cookie对象中存放的数据,可以是任意对象。一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。

下面的程序可以生成一个Cookie对象:

String str="Hello Java Web Program!";

Cookie c=new Cookie("Name",str);

        上面的Cookie对象中,key为Name,其值为str对象。通过response对象,可以将Cookie对象设置到客户端浏览器上。
 response.addCookie(c);

        下面通过实例来说明怎样将一个名为“Name”的Cookie设置到客户端。

        创建一个名为SetCookie的Servlet设置Cookie的值。

@WebServlet("/setcookie")

public class SetCookie extends HttpServlet {

    @Override

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");

        PrintWriter out=response.getWriter();

        out.println("<html><head><title>A Servlet</title></head>");

        out.println("<body>");

        String str="Hello Java Web Program!";

        Cookie c=new Cookie("Name",str);

        response.addCookie(c);

        out.println("<br>");

        out.println("Add Cookie OK!");

        out.println("</body></html>");

        out.flush();

        out.close();

    }

}

试着启动了该Web项目,访问该Servlet后发现该Servlet不能够正常执行。

调试后才发现该Servlet报错了

 将字符串通过UrlEncode编码后再保存到Cookie中

 String str="Hello Java Web Program!";

 str= URLEncoder.encode(str,"UTF-8");

 Cookie c=new Cookie("Name",str);

 然后再刷新浏览器

Cookie增加成功的信息就展示在页面上了。

接着来创建一个名为GetCookie的Servlet来获取Cookie的值。

@WebServlet("/getcookie")

public class GetCookie extends HttpServlet {

    @Override

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");

        PrintWriter out = response.getWriter();

        out.println("<html><head><title>Cookie Getting</title><head>");

        out.println("<body>");

        Cookie[] alls = request.getCookies();

        if (alls != null && alls.length > 0) {

            for (int i = 0; i < alls.length; i++) {

                if ("Name".equals(alls[i].getName())) {

                    String value=alls[i].getValue();

                    value= URLDecoder.decode(value,"UTF-8");

                    out.println(value);

                }

            }

        }

        out.println("</body></html>");

        out.flush();

        out.close();

    }

}

通过在浏览器中输入 http://localhost:8080/s001/getcookie 获取cookie并在页面中打印出来

 3.Cookie的寿命

        Cookie是一种可以制定寿命的对象,一旦Cookie达到其寿命,Cookie自动失效,相同名称的Cookie对象发送给同一个IE浏览器时,后面的Cookie对象会将前面写入的Cookie对象覆盖。

        Cookie的maxAge()决定着Cookie的有效期,单位为秒。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

        如果maxAge参数为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之内,登录网站时该Cookie仍然有效。

以下代码中的Cookie信息将会永远有效。

        如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie的信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失掉了。Cookie默认的maxAge为-1。

        response对象提供的Cookie操作方法只有一个添加操作addCookie,并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie并添加到response中覆盖原来的Cookie即可。

        如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除。

        从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。

4.设置Cookie的属性

setMaxAge()设置Cookie的失效时间。

setSecure()设置Cookie是否仅被使用安全协议传输。

setPath()设置Cookie的使用路径。如果设置为“/CookieWeb/”,则只有contextPath为“/CookieWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。

setDomain()设置可以访问该Cookie的域名。

setVersion()设置Cookie使用的版本号。

5.使用Cookie的限制

        Cookie在网站设计方面,其功能十分灵活,但是Cookie在使用时,有许多限制,下面是在网站设计时需要注意的地方。

  1. Cookie对浏览器有特定的要求,首先浏览器要支持Cookie功能,并且在权限上要允许程序操作客户端浏览器。
  2. Cookie对象是一种数据类型对象,Cookie的读写,必须通过request对象和response对象完成,request对象和response对象是浏览器和服务器间进行通信的唯一途径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1633277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot框架学习笔记(一):依赖管理和自动配置

本文为个人笔记&#xff0c;仅供学习参考之用&#xff0c;如有不当之处请指出。 本文基于springboot2.5.3版本&#xff0c;开发环境需要是 jdk 8 或以上&#xff0c;maven 在 3.5 1 SpringBoot 基本介绍 1.1 官方文档 &#xff08;1&#xff09; 官网 : https://spring.io/pr…

虚函数表与虚函数表指针

虚函数表与虚函数表是用来实现多态的&#xff0c;每一个类只有一个虚函数表 静态多态&#xff1a;函数重载&#xff08;编译期确定&#xff09; 动态多态&#xff1a;虚函数&#xff08;运行期确定&#xff09; 虚函数表的创建时机&#xff1a; 生成时间&#xff1a; 编译期…

交换排序-冒泡排序 快速排序

目录 3.1 冒泡排序 3.2 快速排序 Hoare版本快速排序 挖坑法快速排序 前后指针法快速排序 快速排序优化-三数取中法 快速排序非递归 3.1 冒泡排序 思想&#xff1a;升序情况下&#xff1a;左边大于右边就进行交换&#xff0c;每一次把最大的放在最后一位。 void Swap(int…

【Unity100个实用小技巧】Unity接入微信SDK

前言 为了实现Unity接入微信排行榜,记录一下&#xff0c;为了以后用&#xff0c;本篇文章是对于使用中的一些疑惑点记录。完整流程官方和下面链接都有&#xff0c;补充一些&#xff0c;其他文档中未提到的。 步骤 必要步骤 一. 微信转小游戏 勾选 【使用好友关系链】 二. 看下…

(06)vite与ts的结合

文章目录 系列全集package.json在根目录创建 tsconfig.json 文件在根目录创建 vite.config.ts 文件index.html额外的类型声明 系列全集 &#xff08;01&#xff09;vite 从启动服务器开始 &#xff08;02&#xff09;vite环境变量配置 &#xff08;03&#xff09;vite 处理 c…

基于springboot+vue+Mysql的时间管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

基于双层优化的电动汽车优化调度研究(附matlab程序)

基于双层优化的电动汽车优化调度研究 0.代码链接 基于双层优化的电动汽车优化调度研究(matlab程序)资源-CSDN文库 1.简述 关键词&#xff1a;双层优化 选址定容 输配协同 时空优化 参考文档&#xff1a;《考虑大规模电动汽车接入电网的双层优化调度策略_胡文平》…

机器学习-11-卷积神经网络-基于paddle实现神经网络

文章目录 总结参考本门课程的目标机器学习定义第一步&#xff1a;数据准备第二步&#xff1a;定义网络第三步&#xff1a;训练网络第四步&#xff1a;测试训练好的网络 总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍基于paddle实现神经网络。 参考 MNIST 训练_副…

C# Form1.cs 控件全部丢失的问题解决

在应用C#开发程序时&#xff0c;代码写了一堆&#xff0c;等调试时&#xff0c;点开 Form1.cs窗体时&#xff0c;出现如下提示。点击忽略并继续是&#xff0c;整个窗体控件全部丢失。 初次遇到这个问题&#xff0c;很容易进入到误区&#xff0c;以为窗体控件真的全部丢失了&am…

算法入门ABC

前言 初学算法时真的觉得这东西晦涩难懂&#xff0c;貌似毫无用处&#xff01;后来的后来&#xff0c;终于渐渐明白搞懂算法背后的核心思想&#xff0c;能让你写出更加优雅的代码。就像一首歌唱的那样&#xff1a;后来&#xff0c;我总算学会了如何去爱&#xff0c;可惜你早已远…

Linux磁盘分区与管理

标题日期版本说明署名 Linux磁盘分区与管理 2024.4.29 v0.0.0*******LGB 目标&#xff1a;能够熟练掌握Linux系统磁盘分区管 操作系统&#xff1a;Centos Stream 9 实验过程&#xff1a; 1.首先我们先新建一块磁盘。 2.我们先对新建磁盘进行分区。 3.输入n 创建分区&#xf…

Llama3 在线试用与本地部署

美国当地时间4月18日&#xff0c;Meta 开源了 Llama3 大模型&#xff0c;目前开源版本为 8B 和 70B 。Llama 3 模型相比 Llama 2 具有重大飞跃&#xff0c;并在 8B 和 70B 参数尺度上建立了 LLM 模型的新技术。由于预训练和后训练的改进&#xff0c;Llama3 模型是目前在 8B 和 …

React、React Router 和 Redux 常用Hooks 总结,提升您的开发效率!

Hooks 是 React 16.8 中引入的一种新特性&#xff0c;它使得函数组件可以使用 state 和其他 React 特性&#xff0c;从而大大提高了函数组件的灵活性和功能性。下面分别总结React、React Router 、Redux中常用的Hooks。 常用Hooks速记 React Hooks useState&#xff1a;用于…

vue为遍历生成的表单设置ref属性

最近在写表单重置的时候出现了问题&#xff0c;在this.$refs[formName].resetFields();的时候卡了很久。 经过网上的搜索终于解决的问题&#xff01; 对于不需要遍历的表单 这是vue代码&#xff1a; <el-dialog title"段落描述" :visible.sync"dialogFormV…

流水线工作流程

java编译命令&#xff1a; java -jar xxx.jar (其它参数已忽略) docker镜像构建命令&#xff1a; docker build -t [镜像名称:latest] -f 指定[Dockerfile] [指定工作目录] 推送镜像 jenkinsfile: 主要流程登录镜像仓库&#xff0c;打包镜像&#xff0c;推送到镜像仓库

MySql 主从同步-在原来同步基础上增加历史数据库

在MySql已经主从同步的后&#xff0c;由于有新的需求再增加1个历史数据库&#xff0c;要改原来的1个变成现在的2个数据库。在官网并没有找到类似的场景&#xff08;官方同步多个数据是从一开始就设置&#xff0c;不是后续增加的&#xff09;&#xff0c;只能结合以往的经验自己…

第三方软件测试机构-科技成果评价测试

科技成果评价测试是对科研成果的工作质量、学术水平、实际应用和成熟程度等方面进行的客观、具体、恰当的评价过程。这一评价过程有助于了解科技成果的质量和水平&#xff0c;以及其在学术和应用方面的价值和潜力。 科技成果评价测试主要包括以下几个方面&#xff1a; 工作质量…

OpenVoice: Versatile Instant Voice Cloning

OpenVoice&#xff1a;多功能即时语音克隆 摘要 OpenVoice是一种多功能的即时声音克隆方法&#xff0c;它只需要参考说话者的一小段音频就可以复制他们的声音并以多种语言生成语音。OpenVoice 在解决以下领域中的开放性挑战方面代表了重大进展&#xff1a;1) 灵活的声音风格控…

【1762】java校园单车投放系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java校园单车投放管理系统是一套完善的java web信息管理系统 采用serlvetdaobean&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#…

面试题:两阶段提交与三阶段提交的区别?

主要区别有以下几点&#xff1a; 增加了一个询问阶段&#xff0c;问了下&#xff0c;你能不不能行&#xff1f;加入了超时机制 2PC&#xff08;二阶段提交协议&#xff09; 2PC&#xff0c;两阶段提交&#xff0c;将事务的提交过程分为资源准备和资源提交两个阶段&#xff0c;…