目录
一 会话技术
概念
1.1 会话
1.2 一次会话
1.3 功能
1.4 例子
1.5 方式
2.1 概念
2.2 快速入门
2.3 原理分析
一 会话技术 概念 1.1 会话
一次会话中包含多次请求和响应
1.2 一次会话浏览器第一次给服务器资源发送请求 会话建立 直到有一方断开为止
1.3 功能在一次会话的范围内 共享数据 一次会话中包含多次请求-响应 会话技术 可以在多次请求响应间共享数据
1.4 例子比如购物车一次结算多种商品 每次选择一种商品都是一次请求-响应 多次选择后 一次结算 在多次请求响应之间共享价格等数据
1.5 方式客户端会话技术 cookie 数据存储到客户端
服务端会话技术:Session数据存储到服务器端
二 cookie 2.1 概念客户端会话技术 将数据保存到客户端
2.2 快速入门 1.创建cookie对象 绑定数据 2.发送cookie对象 3.获取cookie 拿到数据cookieDemo1
package cookie; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.cookie; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/cookieDemo1") public class cookieDemo1 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.创建cookie对象 cookie c = new cookie("msg","hello"); //2.发送cookie给浏览器 resp.addcookie(c); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
cookieDemo2
package cookie; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.cookie; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/cookieDemo2") public class cookieDemo2 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //3.获取cookie cookie[] cookies = req.getcookies(); //遍历 if(cookies!=null){ for (cookie c:cookies){ String name = c.getName(); String value = c.getValue(); System.out.println(name+":"+value);//msg:hello } } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }2.3 原理分析
客户端浏览器第一次发送请求 请求cookieDemo1的资源 cookieDemo1发送cookie给浏览器 (真实发送了一个响应头set-cookie:msg=hello)
浏览器会将cookie保存 下一次发送请求时 cookie会被带过去 在请求头中
我们可以通过java的 api来获取发送cookie
2.4 cookie的细节 1.一次可不可以发送多个cookie?可以
//1.创建cookie对象 cookie c = new cookie("msg","hello"); cookie c1 = new cookie("msg1","hi"); //2.发送cookie给浏览器 resp.addcookie(c); resp.addcookie(c1);2.cookie在浏览器中保存多长时间?
-
默认情况下 当浏览器被关闭后 cookie数据被销毁
-
持久化存储 setMaxAge(int time)
-
正数 将cookie数据写到硬盘的文件中 持久化存储 cookie存活时间 如果time=30 说明30s后cookie会被自动删除
-
负数 默认值 浏览器内存中 浏览器关闭就没了
-
零:代表删除cookie信息
-
-
在tomcat8之前 cookie中不能存储中文数据
-
在tomcat8之后 cookie可以存储中文数据 建议使用url编码存储 使用url解码解析 特殊字符 空格等
cookie c = new cookie("msg","爱你");4.cookie共享问题;
一 同一个服务器中
假设在一个服务器中部署了多个web项目 那么在这些web项目中cookie能不能共享
项目/15 项目 /16 cookie由/16发出存储 /15能不能获取到cookie信息呢 ?
默认访问不到的 不能共享
setPath(String path)
设置cookie获取的范围 默认情况下 会去设置当前的虚拟目录
如果要共享
c.setPath("/");
二 不同的服务器中
setDomain(String path)
如果设置一级域名相同 那么多个服务器之间cookie可以共享
例子
setDomain(".baidu.com")
那么tieba.baidu.com和news.baidu.com 中cookie可以共享
5.cookie的特点和作用特点
-
cookie存储数据在客户端浏览器
-
浏览器对于单个cookie的大小有限制(4kb) 以及 对同一个域名cookie的数量也有限制 一般最多20个
作用
-
cookie一般用于存储少量的不太敏感的数据
-
在不登录的情况下 完成服务器端对客户端的身份识别
在不登录的情况下 修改一些属性 服务器可以通过cookie达到一种识别效果
6.cookie案例记住上一次访问时间
需求
-
访问一个Servlet 如果是第一次访问 则提示 您好 欢迎您首次访问
-
如果不是第一次访问 则提示 欢迎回来 您上次访问时间为 xxx
Code
package cookie; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.cookie; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URL; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; @WebServlet("/cookieTest") public class cookieTest extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应的消息体的数据格式编码 //服务器默认为ISO编码 浏览器默认解析用GBK编码 所以会乱码 //设置成utf-8后就相当于告诉浏览器我用的是什么编码 你应该用相同的编码解析 就可以避免乱码 resp.setContentType("text/html;charset=utf-8"); //获取所有cookie cookie[] cookies = req.getcookies(); boolean flag = false; // 遍历所有cookie if(cookies!= null&&cookies.length>0){ for (cookie cookie:cookies) { //获取cookie的名称 String name = cookie.getName(); //判断名称是否为lastname if ("lasttime".equals(name)){ flag=true; //如果if判断为true 则不是第一次访问 //响应数据 String value = cookie.getValue(); //打印到屏幕上 resp.getWriter().write("欢迎回来您上次的访问时间为"+value); //获取当前时间 Date date = new Date(); //格式转换成中国时间格式 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); String format = simpleDateFormat.format(date); //更新cookie的数据 cookie.setValue(format); //返回cookie resp.addcookie(cookie); //设置cookie的存活时间 cookie.setMaxAge(60 * 60); break; } } } if(cookies==null||cookies.length==0||flag==false){ System.out.println("第一次访问"); //第一次访问 //时间 Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); String format = simpleDateFormat.format(date); //创建新cookie cookie lastname = new cookie("lasttime", format); //设置生命周期 lastname.setMaxAge(100000000); //添加cookie resp.addcookie(lastname); //打印在浏览器上 resp.getWriter().write("欢迎您首次登陆"); } } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
人生总有不期而遇的温暖和生生不息的希望。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)