Cookie详解

2023-05-16

介绍Cookie,我们先了解一下什么是会话

会话:

用户开一个浏览器用于查询相关信息,点击多个超链接,访问对应的多个web资源(需要查询的资源) ,然后关闭浏览器。整个过程可以看成一个会话。

会话过程中要解决的问题:

每个用户与服务器交互过程中,会有一些各自的数据,程序要想办法保存每个用户各自对应的数据,常见的是购物车系统,将用户添加的商品用于保存,方便结账

保存会话数据的两种技术:Cookie和Session

Cookie为保存会话数据提供可能,那么什么是Cookie? 所谓Cookie就是指程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户通过浏览器再去访问服务器中的web资源时,就会带着各自的数据区访问。从而达到web资源处理的就是用户各自的数据,可以看出cookie是将数据保存到浏览器,所以Cookie是一种客户端技术。

Cookie技术


Cookie的创建:javax.servlet.http.Cookie来创建一个Cookie,response接口中定义了一个addCookie方法,用于在其响应头中增加一个相应的set-Cookie头字段。而request定义了一个getCookies方法,它用于获取客户端提交的所有Cookie。

Cookie类的方法:

public Cookie(String name,String value) //创建Cookie

setMaxAge()  //设置cookie的生命长度

setPath()  //设置cookie的路径属性。客户端只能向以这个给定的路径String开头的路径返回cookie

看一个例子:

//一个打印访问浏览器时间的servlet 练习cookie
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


response.setCharacterEncoding("UTF-8"); //指定服务器编码
response.setContentType("text/html;charset=UTF-8"); //控制浏览器编码

PrintWriter out = response.getWriter();
out.print("您上次访问的时间是:");

//获取用户的时间cookie
Cookie[] cookies = request.getCookies();
for(int i=0;cookies != null && i < cookies.length; i++)
{
if(cookies[i].getName().equals("LocalLastTime"))
{
Long value = Long.parseLong(cookies[i].getValue());
Date date = new Date(value);
out.print(date.toLocaleString());
}
}

//创建cookie 给用户回送最近的访问时间
Cookie cookie = new Cookie("LocalLastTime",System.currentTimeMillis()+"");
cookie.setMaxAge(24*3600); //cookie在浏览器保存的时间  一天
cookie.setPath("/servlet");

response.addCookie(cookie);
}

上面的servlet,实现功能是当访问该servlet时,会在浏览器打印你上次访问该servlet的时间,通过这个练习,学习Cookie的创建及其生命长度

另外一个例子:通过cookie实现,记录用户访问一个网站的记录

第一个Servlet:ClientCookie

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setCharacterEncoding("ust-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

//1.输出网站所有商品
out.print("本网站的所有书籍:<br/>");
Map<String,Book> map = Db.getAllData();
for(Map.Entry<String, Book> entry : map.entrySet()){
Book book = entry.getValue();
out.print("<a href='/servlet/servlet/CookieBrowse?id="+book.getId()+"'target='_blank'>"+book.getName()+"</a><br/>");
}
//2.显示用户曾经浏览过的所有的商品
out.print("<br/>用户曾经浏览的书籍:<br/>");
Cookie[] cookies = request.getCookies();
for(int i=0;cookies != null && i < cookies.length; i++){
if(cookies[i].getName().equals("bookHistory")){
String ids[] = cookies[i].getValue().split("\\,");
for(String id : ids){
Book book = (Book) Db.getAllData().get(id);
out.print(book.getName()+"<br/>");
}
}
}

}

class Db{

private static LinkedHashMap<String, Book> map = new LinkedHashMap<String,Book>();

static {
map.put("1", new Book("1","java","kermit","a good book"));
map.put("2", new Book("2","html","kermit","a good book"));
map.put("3", new Book("3","C","kermit","a good book"));
map.put("4", new Book("4","C++","kermit","a good book"));
map.put("5", new Book("5","XML","kermit","a good book"));
}

public static Map getAllData(){
return map;
}
}


class Book{

private String id;
private String name;
private String auth;
private String description;

public Book(String id, String name, String auth, String description) {
super();
this.id = id;
this.name = name;
this.auth = auth;
this.description = description;

}

    set, get方法略。。。

}


第二个Servlet:BrowseCookie

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


response.setCharacterEncoding("utf-8");
response.setContentType("text/html;utf-8");
PrintWriter out = response.getWriter();
//根据用户带过来的ID 显示书籍的详细信息
String id = request.getParameter("id");
Book book = (Book) Db.getAllData().get(id);
out.print("书籍详细信息:<br/>");
out.print(book.getId() + "<br>");
out.print(book.getName() + "<br/>");
out.print(book.getAuth() + "<br/>");
out.print(book.getDescription() + "<br/>");

//构建cookie 回写给浏览器
String cookieValue = bulidCookie(id,request);  //得到访问记录
Cookie cookie = new Cookie("bookHistory",cookieValue);  //创建名称为bookHistory的cookie 值为访问记录
cookie.setMaxAge(30*24*3600); //cookie保存在浏览器的时间为1个月
cookie.setPath("/servlet");  //工程路径
response.addCookie(cookie);  //在响应中增加一个指定的cookie
}


private String bulidCookie(String id, HttpServletRequest request) {

//bookHistory=null          1        1           第一次访问 直接返回ID 
//bookHistory=2,5,4        1        1,2,5     以前没有访问过 删除访问记录中的最后一个 将新访问的加在第一个 
//bookHistory=2,5,1        1        1,2,5     以前有访问过 删除以前访问的 将新访问的加在第一个 
//bookHistory=2,5           1        1.2,5     未访问过 且小于记录最大数3 直接将访问的ID 加在第一个
String bookHistory = null;  //记录用户访问的书籍的所有ID号 
Cookie[] cookies = request.getCookies();
for(int i=0;cookies!=null&&i<cookies.length;i++){
if(cookies[i].getName().equals("bookHistory")){
bookHistory = cookies[i].getValue();
}
}
if(bookHistory == null){ //第一次查看书籍
return id;
}

LinkedList<String> list = new LinkedList(Arrays.asList(bookHistory.split("\\,")));
if(list.contains(id)){   //访问记录最大为3个记录
//bookHistory=2,5,1       1        1,2,5  以前有访问过 删除以前访问的 将新访问的加在第一个 
list.remove(id);
list.addFirst(id);
} else {
//bookHistory=2,5,4        1        1,2,5   以前没有访问过 删除访问记录中的最后一个 将新访问的加在第一个
if(list.size() >= 3){
list.removeLast();
list.addFirst(id);
} else {
//bookHistory=2,5          1        1.2,5  未访问过 且小于记录最大数3 直接将访问的ID 加在第一个
list.addFirst(id);
}
}

StringBuilder sb = new StringBuilder();
for(String ids : list){
sb.append(ids + ",");  //用“,”将访问的书籍ID 分割开
}

return sb.substring(0,sb.length() - 1).toString();  //返回访问记录

}

自学笔记,多有不足!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cookie详解 的相关文章

随机推荐

  • yum安装rabbitmq的目录

    一般我们yum安装完rabbitmq后 xff0c 不知道安装到什么地方了 xff0c 其实是安装到下面的路径 usr lib rabbitmq lib 如下图所示 xff1a
  • Linux环境安装Redis

    下载地址 xff1a http download redis io releases 安装步骤 xff1a 1 安装gcc yum install gcc 2 把下载好的redis 4 0 14 tar gz xff08 选择你自己的版本
  • Redis主从环境搭建

    首先先搭建一个Redis xff1a 搭建方法 xff1a Linux环境安装redis 1 新建一个目录 xff0c 按照上述链接中的方法再次搭建一个redis 2 搭建完后 xff0c 修改从节点的redis conf文件 2 1 修改
  • Redis集群环境搭建

    一 下载redis xff08 此处我下载的是5 0 3版本 xff09 下载地址 xff1a http download redis io releases Linux命令下载 xff1a wget http download redis
  • Jvisualvm使用及添加Visual GC组件

    只要装了jdk xff0c 就会自带这个工具 xff0c 路径位置如下 xff1a JVisualvm添加Visual GC插件 动态观察各个年代GC情况 访问地址 xff1a https visualvm github io plugin
  • Spring源码编译Java: 找不到符号 InstrumentationSavingAgent

    报错如下 xff1a 解决 xff1a 将spring context gradle文件的 下面这一行 br optional project 34 spring instrument 34 br 修改为 br compile projec
  • RabbitMQ学习(六)——消息确认机制(Confirm模式)

    在上一篇文章中我们讲解了RabbitMQ中的AMQP事务来保证消息发送到Broker端 xff0c 同时我们可以在事务之间发送多条消息 xff08 即在channel txSelect 和channel txCommit 之间发送多条消息
  • zookeeper初识

    一 节点类型 persistent 持久节点 persistent sequential 持久序号节点 ephemeral 临时节点 ephemeral sequential 临时序号节点 1 persistent 持久节点 默认创建的节点
  • xmlns:dubbo=“http://dubbo.apache.org/schema/dubbo“报错

    请先看看你有没有加dubbo的maven依赖 xff0c 官网在做这个demo的时候并没有说要加maven依赖 xff0c 所以会xml中会报红 lt beans xmlns xsi 61 34 http www w3 org 2001 X
  • tomcat 8源码环境编译

    源码下载 下载地址 xff1a https tomcat apache org download 80 cgi 配置 1 解压下载好的源码包 apache tomcat 8 5 57 src zip 2 解压好后 xff0c 在解压后的目录
  • servlet配置文件解析

    1 配置 lt servlet gt xff08 以下代码均是web xml中的 xff09 lt servlet gt lt servlet name gt FirstServlet lt servlet name gt lt servl
  • 线程基础之—线程的创建

    线程创建分三类 1 继承Thread 43 run 启动 xff1a 创建子类对象 43 对象 start 2 实现Runnable 43 run 启动 xff1a 使用静态代理 1 gt 创建真实角色 2 gt 创建代理角色 Thread
  • 死锁

    一个死锁的代码 public class Demo public static void main String args Object g 61 new Object Object m 61 new Object Goods goods
  • 多线程之任务调度

    Timer定时器类 TimerTask任务类 通过java timer timetask xff1a xff08 Spring的任务的任务调度就是通过他们实现的 xff09 在这种实现方式中 xff0c Timer类实现的是类似于闹钟的功能
  • static关键字

    在类中 xff0c 用static声明的成员变量为静态成员变量 xff0c 或者叫做 xff1a 类属性 xff0c 类变量 它为该类的公用变量 xff0c 属于类 xff0c 被该类的所有实例共享 xff0c 在类被载入时被显示初始化对于
  • I/O流读写文件详解

    文件类 文件中路径的写法 xff1a 1 String filePath 61 34 C AAA a txt 34 第一个 表示转义字符 2 filePath 61 34 C 34 43 File pathSeparator 43 34 A
  • 日志工具Log4J

    目前在java编程中 xff0c 日志已经发展出一套成熟的机制 常用的日志控件有Commons logging log4j以及JDK自带的Logging 从最初的System out println 到现在的Log4j xff0c java
  • CAS单点登录(七)——自定义验证码以及自定义错误信息

    在前面我们讲解了CAS单点登录 六 自定义登录界面和表单信息 xff0c 知道了如何去实现页面和表单信息的自定义信息提交 xff0c 就像我们提交表单的信息可能包括手机 邮箱等等 xff0c 这些都能以我们前面的知识点去解决 但平时登录我们
  • Http协议之Request和Response

    协议版本 xff1a Http 1 0 Http 1 1 http1 0协议中 xff0c 客户端与服务器建立连接后 xff0c 只能获得一个 web 资源 http1 1协议中 xff0c 客户端与服务器建立连接后 xff0c 在一个连接
  • Cookie详解

    介绍Cookie xff0c 我们先了解一下什么是会话 会话 xff1a 用户开一个浏览器用于查询相关信息 xff0c 点击多个超链接 xff0c 访问对应的多个web资源 xff08 需要查询的资源 xff09 xff0c 然后关闭浏览器