查询有道词典得:html
web和饼干有啥关系?java
这个谜底等等来为你们揭晓web
web中的会话技术相似于生活中两我的聊天,不过web中的会话指的是服务器与客户端的交互数组
一次会话中包含屡次的请求与响应,当浏览器给服务器发送请求时会话创建,直到一方断开时会话结束。
功能:在一次会话的范围内的屡次请求之间,能够共享数据
这句话是什么意思呢,我用购物车来解释
浏览器
1.在浏览器中,常常涉及到数据交换,如:你登陆一个页面。咱们常常会设置自动登陆选项。那么它们就是经过cookie来记住咱们的信息的, cookie是由HTTP服务器社长子的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务端和客户端的连接就会关闭,每次交换数据都须要创建新的连接。就像咱们去超市买东西,没有积分卡的状况下,咱们买完东西以后,超市没有咱们任何的消费信息,但咱们办了积分卡以后,超市就有了咱们的消费信息。cookie就像是积分卡,能够保存积分,商品就是咱们的信息,超市的系统就像服务器后台,HTTP协议就是交易的过程。tomcat
2.如今上许多网站都用新用户注册这一项,有时注册一下,等到下次在访问该站点时,会自动识别到你,并贴向你问好,是否是以为很亲切?固然这种做用知识表面现象,更重要的是,网站能够利用Cookie跟踪统计用户访问该网站的习惯,好比什么时间访问,访问了哪些页面,在每一个网页的停留时间等。利用这些信息,一方面是能够为用户提供个性化服务,另外一方面,也能够做为了解全部用户行为的工具,对于网站经营策略的改进有必定参考价值。例如,你在某家航空公司站点查阅航班时刻表,该站点可能就建立了包含你旅行计划的Cookies,也可能它只记录了你在该站点上曾经访问过的Web页,在你下次访问时,网站根据你的状况对显示的内容进行调整,将你所感兴趣的内容放在前列。这是高级的COokie应用。服务器
是一种客户端会话技术将数据保存到客户端cookie
cookie的利弊:
1.将数据保存到客户端,十分方便,同时减轻服务器存储压力
2.对保存数据的个数(20)及大小有限制(4kb)java-web
做用
cookie用来保存少许及不太敏感的数据
能够在不登入的状况下,对客户端完成身份识别(即在客户端设置一个set-cookie的键值对,在访问的时候使用键值对来获取客户端的身份)ide
我从如下三个步骤来介绍cookie的使用
1.建立cookie对象
2.发送cookie对象
3.获取cookie对象
由Servlet1设置cookie,Servlet2获取cookie
Servlet1
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/demo1") public class Servlet1 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //建立cookie Cookie cookie = new Cookie("name", "zhangsan"); resp.addCookie(cookie); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }
Servlet2
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/demo2") public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取cookie Cookie[] cookies = req.getCookies(); if (cookies!=null){ for (Cookie cookie : cookies) { //获取cookie值与名称 String value = cookie.getValue(); String name = cookie.getName(); System.out.println(name+":"+value); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
响应cookie
请求cookie,另外两个cookie咱们这里不作介绍
图解:
1.如何实现发送多个Cookie
2.Cookie能够在浏览器中保存多长时间
3.Cookie如何保存中文
4.Cookie共享问题
使用response对象调用addCookie方法发送cookie便可
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/demo1") public class Servlet1 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //建立cookie //建立第一个cookie Cookie cookie = new Cookie("name", "zhangsan"); //发送第一个cookie resp.addCookie(cookie); //建立第二个cookie Cookie id = new Cookie("id", "1"); //发送第二个cookie resp.addCookie(id); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/demo2") public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取cookie Cookie[] cookies = req.getCookies(); //遍历cookie数组 if (cookies!=null){ for (Cookie cookie : cookies) { //获取cookie值与名称 String value = cookie.getValue(); String name = cookie.getName(); System.out.println(name+":"+value); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
客户端显示
IDEA打印
2.Cookie能够在浏览器中保存多长时间
默认状况下浏览器关闭后,Cookie数据被销毁
咱们能够调用setmaxage(int seconds)方法来设置Cookie的存储时间
1.second为正数,将Cookie持久化写入硬盘,而且指定存储的时间,时间到了cookie自动失效
2.second为零,删除cookie
3.second小于零,默认值,即浏览器关闭后删除cookie
好比我使用如下代码往Cookie中加入数据发送cookie浏览器就会报错,由于往cookie中加入了空格
Cookie cookie = new Cookie("name", "张 三"); //发送第一个cookie resp.addCookie(cookie);
因此我须要使用url编码来控制数据
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder; @WebServlet("/demo1") public class Servlet1 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应的消息体的数据格式以及编码 resp.setContentType("text/html;charset=utf-8"); //建立cookie //建立第一个cookie String name="张 三"; //URL编码 name= URLEncoder.encode(name,"utf-8"); Cookie cookie = new Cookie("name", name); resp.addCookie(cookie); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLDecoder; @WebServlet("/demo2") public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取cookie Cookie[] cookies = req.getCookies(); //遍历cookie数组 if (cookies!=null){ for (Cookie cookie : cookies) { //获取cookie值与名称 String value = cookie.getValue(); String name = cookie.getName(); //解码前 System.out.println(name+":"+value); //解码后 System.out.println(name+":"+ URLDecoder.decode(value,"utf-8")); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
结果:
再也不报错
1.假设在一个Tomcat服务器中部署了多个web项目,如何实现cookie在这些项目中的共享
默认状况下是不能够共享的
可是咱们能够调用setpath()方法来设置cookie的获取范围默认状况下,设置当前的虚拟目录 * 若是要共享,则能够将path设置为"/"
//设置响应的消息体的数据格式以及编码 resp.setContentType("text/html;charset=utf-8"); //建立cookie //建立第一个cookie String name="张 三"; //URL编码 name= URLEncoder.encode(name,"utf-8"); Cookie cookie = new Cookie("name", name); //设置path让当前服务器下部署的全部项目共享cookie的信息 //设置为”/“便可共享 cookie.setPath("/"); resp.addCookie(cookie);
//设置响应的消息体的数据格式以及编码 resp.setContentType("text/html;charset=utf-8"); //建立cookie //建立第一个cookie String name="张 三"; //URL编码 name= URLEncoder.encode(name,"utf-8"); Cookie cookie = new Cookie("name", name); //设置path让不一样的服务器之间能够共享cookie的信息 //好比设置域名为".baidu.com"的能够共享cookie cookie.setDomain(".baidu.com"); resp.addCookie(cookie);