java之Cookie详解

Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入JSESSIONID用于标记一个会话(session),这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

Cookie是客户端技术,而HttpSession是服务器端技术。

java中Cookie详细介绍:

1、Cookie是什么?

  一个小信息,由服务器写给浏览器的。由浏览器来保存。

  客户端保存的Cookie信息,可以再次带给服务器。

  Cookie类:javax.servlet.http.Cookie

2、Cookie的属性:

name:必须的

value:必须的

comment:可选的。注释

path: 可选的,如果不设置路径,那么只有设置该cookie的URI及其子路径可以访问

      写Cookie的程序的访问路径是:http://localhost:8080/JavaWeb/servlet/CookieDemo

      其中:localhost就是域名;/JavaWeb/servlet就是当前Cookie的path       若访问的地址的URI包含着cookie的路径,即URI.startWith(cookie的路径),为true,则客户端将该cookie带给服务器。       比如浏览器存的cookie的路径是/JavaWeb       现在访问的地址是:http://localhost:8080/JavaWeb/servlet/CookieDemo  则带该cookie       现在访问的地址是:http://localhost:8080/JavaWeb/CookieDemo  则带该cookie       若浏览器存的cookie的路径是/JavaWeb/servlet/       访问的地址是:http://localhost:8080/JavaWeb/servlet/CookieDemo   则带该cookie       访问的地址是:http://localhost:8080/JavaWeb/CookieDemo   则不带该cookie       如果一个cookie的路径设置成了/JavaWeb,意味着浏览器访问当前应用下的所有资源时都会带着该cookie给服务器。

domain:可选的。该Cookie所属的网站域名。(apache.org)默认值。

maximum age:可选的。不设置就是会话过程(存在浏览器的内存中)。单位是秒           如果是0,说明要删除。

version:可选的。

3、如何向客户端写Cookie:

HttpServletResponse对象.addCookie(javax.servlet.http.Cookie对象)(就是写了一个响应消息头:Set-Cookie:cookie的信息)

Servlet规范中的Cookie API 提供了setMaxAge  setPath setDomain等方法,可以对Cookie状态进行控制

特点:一个浏览器针对一个网站最多存20个Cookie;最多存300个Cookie,每个Cookie的长度不能超过4KB(稀缺)。只是规定,但不同的浏览器实现的不同。

 1     public void doGet(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3         Cookie cookie=new Cookie("name","Tom");
 4         //设置Maximum Age
 5         cookie.setMaxAge(1000);
 6         //设置cookie路径为当前项目路径
 7         cookie.setPath(request.getContextPath());
 8         //添加cookie
 9         response.addCookie(cookie);
10     }

4、服务器如何得到客户端传来的Cookie:

在Java中利用Serlvet或者JSP scriptlet可以向浏览器端写入Cookie,同样,利用Servet或者JSP scriptlet 也可以读取到 Cookie信息

Servlet规范中的Cookie API 同样存在getMaxAge  getPath  getDomain等方法,可以获得相应的状态。

不过此处存在一个问题:

读取Cookie时,发现除了Cookie的key和value外,其他值获取都为null。

原因很简单:Cookie从服务器端发送到客户端时,信息是完整的,Cookie从客户器端发送到服务端时,信息只剩下key、value了。(因为Domain不对的Cookie、Path不对的Cookie、过期的Cookie,客户端是不会发送过来的)

那为什么Java中提供了相应的get方法呢? 那个方法其实是在生成Cookie后,尚未发送到客户端时使用的

服务器端通过HttpServletRequest对象.getCookies()可获取cookies数组。

 1     public void doGet(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3         PrintWriter out=response.getWriter();
 4         Cookie[] cookies=request.getCookies();
 5         if(cookies!=null){
 6             for(Cookie cookie:cookies){
 7                 String name=cookie.getName();
 8                 String value=cookie.getValue();
 9                 out.write(name+"="+value);
10             }
11         }
12     }

5、如何区分Cookie:

通过名称不行,应通过domain+path+name来区分的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

Java父类强制转换子类原则

最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了。 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗?...

49880
来自专栏Java技术栈

Java内存泄漏介绍

内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存。但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏...

41270
来自专栏Java3y

Java实现单向链表

一、前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了。数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用~ 本...

1K80
来自专栏Java技术栈

递归算法介绍及Java应用实战

什么是递归算法 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。一个过程(或函数)直接或间接调用自己本身,这种过程...

448100
来自专栏Java技术栈

Java对象引用四个级别(强、软、弱、虚)

最近,高级Java技术栈微信群中,有一些猿友在讨论JVM中对象的周期问题,有谈到引用的级别,现在为大家做个总结吧,虽然大多数公司并没有意识或者用到这些引用,但了...

465130
来自专栏Java技术栈

JSON Web Token (JWT)生成Token及解密实战。

昨天讲解了JWT的介绍、应用场景、优点及注意事项等,今天来个JWT具体的使用实践吧。 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用...

1.1K50
来自专栏SDNLAB

ONOS集群选举分析

首先简单介绍下自己,之前是做 floodlight 控制器开发的,鉴于 ODL 和 onos 的如火如荼的发展,如果不对了解点就感觉自己 OUT 了,因此忙里偷...

39360
来自专栏Java3y

栈和队列就是这么简单

一、前言 上一篇已经讲过了链表【Java实现单向链表】了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并...

394100
来自专栏Java技术栈

为什么Netty这么火?与Mina相比有什么优势?

Netty是什么?为什么这么火? Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工...

87470
来自专栏Java技术栈

史上最全Java多线程面试题及答案

多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域。所以,学好多线程并发编程对Java程序员来来说极其重要的。 下面小编整理了60道最常见的Ja...

456110

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励