javaweb之Cookie学习
Cookie简介
- HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的Web程序的设计。如:在我们进行网购时,买了一条裤子,又买了一个手机。由于http协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么。而Cookie就是解决方案之一。
- Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。
- 例如:我们上文说的网上商城,当用户向购物车中添加一个商品时,服务器会将这个条信息封装成一个Cookie发送给浏览器,浏览器收到Cookie,会将它保存在内存中(注意这里的内存是本机内存,而不是服务器内存),那之后每次向服务器发送请求,浏览器都会携带该Cookie,而服务器就可以通过读取Cookie来判断用户到底买了哪些商品。当用户进行结账操作时,服务器就可以根据Cookie的信息来做结算。
- Cookie的用途:
- 网上商城的购物车
- 保持用户登录状态
- Cookie的原理:
- 总的来看Cookie像是服务器发给浏览器的一张“会员卡”,浏览器每次向服务器发送请求时都会带着这张“会员卡”,当服务器看到这张“会员卡”时就可以识别浏览器的身份。
- 实际上这个所谓的“会员卡”就是服务器发送的一个响应头:
- 当浏览器再次向服务器发送请求时就会携带这个Cookie信息:
- 于是服务器就可以根据Cookie信息来判断浏览器的状态。
- Cookie的缺点
- Cookie最为请求或响应报文发送,无形中增加了网络流量。
- Cookie是明文传送的安全性差。
- 各个浏览器对Cookie有限制,使用上有局限
使用Cookie
- 使用Cookie主要是先创建Cookie对象,然后将Cookie信息发送给浏览器,浏览器收到Cookie后会自动保存,然后我们可以在下次浏览器发送请求时读取Cookie信息。
设置Cookie
- 创建一个CookieServlet
- 在Servlet的doPost()方法中编写如下代码:
//创建一个Cookie对象
Cookie cookie = new Cookie("username", "zhangsan");
//将Cookie对象放入response对象中
response.addCookie(cookie);
|
- 在浏览器中访问该Servlet,会发现响应头中出现如下内容:
- 如此就成功的向浏览器设置了一个Cookie,当我们在刷新页面时会发现浏览器的请求头中出现如下代码:
- 同样我们还可以同时设置多个Cookie:
//创建一个Cookie对象
Cookie cookie1 = new Cookie("username", "zhangsan");
Cookie cookie2 = new Cookie("password", "123456");
Cookie cookie3 = new Cookie("age", "20");
//将Cookie对象放入response对象中
response.addCookie(cookie1);
response.addCookie(cookie2);
response.addCookie(cookie3);
|
- 浏览器会以一下形式发送Cookie:
- 总之,设置Cookie就是两个步骤:
- 创建Cookie对象
- 将Cookie对象加入到response中
读取Cookie
- 读取Cookie主要指从读取浏览器中携带的Cookie
- 只需要通过一个方法就可以得到浏览器中的Cookie,在Servlet或JSP中通过request对象调用getCookies()方法可以获得浏览器传送过来的所有Cookie对象,返回的是一个Cookie数组,通过遍历Cookie数组可以获得所有的Cookie信息。
- 如:
//通过request的getCookies()方法获的Cookie数组
Cookie[] cookies = request.getCookies();
//判断数组是否为空
if(cookies != null){
//如果不为空遍历数组
for(Cookie cookie : cookies){
//获取cookie的名字
String name = cookie.getName();
//获取cookie的键
String value = cookie.getValue();
System.out.println(name+"---"+value);
}
}
|
Cookie有效时间
- 经过上边的介绍我们已经知道Cookie是存储在浏览器中的,但是可想而知一般情况下浏览器不可能永远保存一个Cookie,一来是占用硬盘空间,再来一个Cookie可能只在某一时刻有用没必要长久保存。
- 所以我们还需要为Cookie设置一个有效时间。
- 通过Cookie对象的setMaxAge()可以设置Cookie的有效时间。
- 其中setMaxAge()接收一个int型的参数,来设置有效时间。参数主要有一下四种情况:
- 设置为0,setMaxAge(0)
- Cookie立即失效,下次浏览器发送请求将不会在携带该Cookie
- 设置大于0,setMaxAge(60)
- 表示有效的秒数60就代表60秒即1分钟,也就是Cookie在1分钟后失效。
- 设置小于0,setMaxAge(-1)
- 设置为负数表示当前会话有效。也就是关闭浏览器后Cookie失效
- 不设置
- 如果不设置失效时间,则默认当前会话有效。
Cookie的路径
- Cookie的路径指告诉浏览器访问那些地址时该携带该Cookie,我们知道浏览器会保存很多不同网站的Cookie,比如百度的Cookie,新浪的Cookie,腾讯的Cookie等等。那我们不可能访问百度的时候携带新浪的Cookie,也不可能访问每个网站时都带上所有的Cookie这是不现实的,所以往往我们还需要为Cookie设置一个Path属性,来告诉浏览器何时携带该Cookie。
- 我们同过Cookie的setPath()来设置路径,这个路径是由浏览器来解析的所以/代表服务器的根目录。
- 如:
- 设置为 /项目名/路径 à cookie.setPath(“/项目名/路径”)
- 这样设置只有访问“/项目名/路径”下的的资源才会携带Cookie
- 如:/项目名/路径/1.jsp 、/项目名/路径/hello/2.jsp 等
- 如果不设置,默认会在访问“/项目名”下的资源时携带
- 如:“/项目名/index.jsp” 、 “/项目名/hello/index.jsp”
javaweb之Cookie学习的更多相关文章
- JavaWeb 8 Cookie
JavaWeb 8 Cookie 2. 会话管理入门 2.1 生活中会话 我: 小张,你会跳小苹果码? 小张: 会,怎么了? ...
- JavaWeb利用cookie记住账号
JavaWeb利用cookie记住账号. 首先,来看看界面什么样子. 记住账号最普遍的做法,就是在点击登录时,将账号保存到cookie中. 材料准备 <script src="${ct ...
- JavaWeb和WebGIS学习笔记(七)——MapGuide Open Source安装、配置以及MapGuide Maestro发布地图——超详细!目前最保姆级的MapGuide上手指南!
JavaWeb和WebGIS学习笔记(七)--MapGuide Open Source安装.配置以及MapGuide Maestro发布地图 超详细!目前最保姆级的MapGuide上手指南! 系列链接 ...
- JavaWeb和WebGIS学习笔记(六)——使用ArcGIS for Server发布地图服务
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- JavaWeb和WebGIS学习笔记(五)——使用OpenLayers显示地图
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- JavaWeb和WebGIS学习笔记(四)——使用uDig美化地图,并叠加显示多个图层
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- JavaWeb和WebGIS学习笔记(三)——GeoServer 发布shp数据地图
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- java基础学习:JavaWeb之Cookie和Session
一.会话概述 1.1.什么是会话? 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话其中不管浏览器发送多少请求,都视为一次会话,直到 ...
- Cookie学习笔记二:Cookie实例
今天说说刚刚学到的两个Cookie的最经典应用:自己主动登录和购物车设置 一:自己主动登录 须要两个页面:login.jsp与index.jsp,login.jsp用来输出登录信息,index.jsp ...
随机推荐
- c/c++ 线性表之单向循环链表
c/c++ 线性表之单向循环链表 线性表之单向循环链表 不是存放在连续的内存空间,链表中的每个节点的next都指向下一个节点,最后一个节点的下一个节点不是NULL,而是头节点.因为头尾相连,所以叫单向 ...
- Windows Server 2016-Win Ser 2016已删减内容
本章与大家简单聊聊已经从Windows Server 2016产品中删减掉或者计划在以后潜在删除的功能或者模块. 文件服务器 共享和存储管理贴靠-Microsoft 管理控制台已删除. 相反,请执行以 ...
- Python爬虫之Urllib库的基本使用
# get请求 import urllib.request response = urllib.request.urlopen("http://www.baidu.com") pr ...
- 2016某知名互联网公司PHP面试题及答案(续)
1 写出mysql中,插入数据,读出数据,更新数据的语句 INSERT INTO 表名 VALUES ("",""): SELECT * FROM 表名:. U ...
- WIndows 使用VS编译 Lua5
从Lua5.1开始官方给出的文件只有源代码和makefile文件了,官网给出的bulid方式也是在linux平台,如果只是想找个库使用下可以到这里来下载:http://joedf.ahkscript. ...
- js data日期初始化的5种方法 [转]
创建一个日期对象: 复制代码代码如下: var objDate=new Date([arguments list]); 参数形式有以下5种: 1)new Date("month dd,yy ...
- 【BZOJ1449】 球队收益
BZOJ1449 球队收益 Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 Sa ...
- WPF设计の不规则窗体
我们在工作中,经常会需要画一些不规则的窗体,现在总结如下. 一.利用VisualBrush实现.这依赖于VisualBrush的特性,任何控件可以作为画刷,而画刷又可以作为背景. 此种方法可以用于实现 ...
- Vim怎么批量处理文件将tab变为space
:%s/\t/ /g https://zhidao.baidu.com/question/563849372716100364.html
- java递归删除文件夹
递归删除文件夹 public static void delete(File file) { if(!file.exists()){ return; } if(file.isFile() || fil ...