java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
下面小编就为大家带来一篇老生常谈 java 中 cookie 的使用小编觉得挺不错的, 现在就分享给大家, 也给大家做个参考一起跟随小编过来看看吧
1 什么是 cookie
浏览器与 web 服务器之间是使用 HTTP 协议进行通信的, 当某个用户发出页面请求时, WEB 服务器只是简单的进行响应, 然后就关闭与该用户的连接因此当一个请求发送到 WEB 服务器时, 无论其是否是第一次来访, 服务器都会把它当作第一次来对待, 这样的不好之处可想而知为了弥补这个缺陷, Netscape 开发出了 cookie 这个有效的工具来保存某个用户的识别信息, 因此人们昵称为小甜饼 cookies 是一种 WEB 服务器通过浏览器在访问者的硬盘上存储信息的手段: Netscape Navigator 使用一个名为 cookies.txt 本地文件保存从所有站点接收的 Cookie 信息; 而 IE 浏览器把 Cookie 信息保存在类似于 C:\windows\cookies 的目录下当用户再次访问某个站点时, 服务端将要求浏览器查找并返回先前发送的 Cookie 信息, 来识别这个用户
2 cookie 的四个属性
max-age 指定 Ccookie 的生存周期(以秒为单位)! 默认情况下, Cookie 的值只在浏览器的会话期间存在, 当用户退出浏览器这些值就消失了!
path 指定与 Cookie 关联在一起的网页. 默认情况下, cookie 会和创建它的网页以及与这个网页处于同一个目录下的网页和处于该目录下的子目录关联
domain 设置访问域 举个例子: 位于 order.example.com 的服务器要读取 catalog.example.com 设置的 cookie. 这里就要引入 domain 属性, 假定由位于 catalog.example.com 的页面创 的 cookie 把自己的 path 属性设置为 "/", 把 domain 属性设置为 ".example.com", 那么所有位于 "catalog.example.com" 的网页和所有位于 "orders.example.com" 的网页以及所有位于 example.com 域的其他服务器上得网页都能够访问这个 cookie. 如果没有设置 cookie 的 domain 值, 该属性的默认值就是创建 cookie 的网页所在的 服务器的主机名 注意: 不能将一个 cookie 的域设置成服务器所在的域之外的域.
seure 指定在网络上如何传输 cookie 的值
3 java Cookie 操作
创建 Cookie
- // new 一个 Cookie 对象, 键值对为参数
- Cookie cookie = new Cookie("key", "cookie 的 value 值");
如果 cookie 的值中含有中文时, 需要对 cookie 进行编码, 不然会产生乱码, 使用
- URLEncoder.encode("cookie 的 value 值","utf-8");
- // 设置 Cookie 最大生存时间, 以秒为单位, 负数的话为浏览器进程, 关闭浏览器 Cookie 消失
- cookie.setMaxAge(*24*60*60); // 一天
- // 将 Cookie 添加到 Response 中, 使之生效
- response.addCookie(cookie); //addCookie 后, 如果已经存在相同名字的 cookie, 则最新的覆盖旧的 cookie
注意: 在 Struts 中可以使用 ServletActionContext.getResponse()获得 respone 对象
读取 cookie
读取 Cookie 只能从 request 中获取全部 Cookie, 然后循环迭代
在 Struts 中可以使用 ServletActionContext.getRequest()获得 request 对象
- // 从 request 中获取 Cookie, 拿到的是一个 Cookie 数组
- Cookie[] cookies = request.getCookies();
- // 然后迭代之
- if (cookies != null && cookies.length > 0) { // 如果没有设置过 Cookie 会返回 null
- for (Cookie cookie : cookies) {...}
- }
删除 cookie
删除 Cookie 的话, 只需要将 Cookie 的生存期设为 0 即可
- Cookie[] cookies = request.getCookies();
- if (cookies != null && cookies.length > 0) {
- for (Cookie cookie : cookies) {
- String name = cookie.getName();
- // 找到需要删除的 Cookie
- if (name.compareTo("target-key") == 0) {
- // 设置生存期为 0
- cookie.setMaxAge(0);
- // 设回 Response 中生效
- response.addCookie(cookie);
- }
- }
- }
4 cookie 的 setPath 方法使用:
正常的 cookie 只能在一个应用中共享, 即一个 cookie 只能由创建它的应用获得
1. 可在同一应用服务器内共享方法: 设置 cookie.setPath("/");
本机 tomcat/webapp 下面有两个应用: webapp_a 和 webapp_b,
1)原来在 webapp_a 下面设置的 cookie, 在 webapp_b 下面获取不到, path 默认是产生 cookie 的应用的路径
2)若在 webapp_a 下面设置 cookie 的时候, 增加一条 cookie.setPath("/"); 或者 cookie.setPath("/webapp_b/");
就可以在 webapp_b 下面获取到 cas 设置的 cookie 了
3)此处的参数, 是相对于应用服务器存放应用的文件夹的根目录而言的(比如 tomcat 下面的 webapp), 因此 cookie.setPath("/"); 之后, 可以在 webapp 文件夹下的所有应用共享 cookie, 而 cookie.setPath("/webapp_b/");
是指 cas 应用设置的 cookie 只能在 webapp_b 应用下的获得, 即便是产生这个 cookie 的 webapp_a 应用也不可以
4)设置 cookie.setPath("/webapp_b/jsp")或者 cookie.setPath("/webapp_b/jsp/")的时候, 只有在 webapp_b/jsp 下面可以获得 cookie, 在 webapp_b 下面但是在 jsp 文件夹外的都不能获得 cookie
5)设置 cookie.setPath("/webapp_b");, 是指在 webapp_b 下面才可以使用 cookie, 这样就不可以在产生 cookie 的应用 webapp_a 下面获取 cookie 了
6)有多条 cookie.setPath("XXX"); 语句的时候, 起作用的以最后一条为准
5 cookie.setDomain 方法设计跨域共享
A 机所在的域: home.langchao.com,A 有应用 webapp_a
B 机所在的域: jszx.com,B 有应用 webapp_b
1)在 webapp_a 下面设置 cookie 的时候, 增加 cookie.setDomain(".jszx.com");, 这样在 webapp_b 下面就可以取到 cookie
2)输入 url 访问 webapp_b 的时候, 必须输入域名才能解析比如说在 A 机器输入: http://lc-bsp.jszx.com:8080/webapp_b, 可以获取 webapp_a 在客户端设置的 cookie, 而 B 机器访问本机的应用, 输入: http://localhost:8080/webapp_b 则不可以获得 cookie
3)设置了 cookie.setDomain(".jszx.com");, 还可以在默认的 home.langchao.com 下面共享
来源: http://www.phperz.com/article/18/0222/359215.html