老生常谈java中cookie的使用

作者:jingxian 时间:2023-11-11 04:37:59 

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下面共享

标签:java,cookie
0
投稿

猜你喜欢

  • 使用Jenkins来构建SVN+Maven项目的实现

    2023-07-30 12:45:22
  • C语言植物大战数据结构二叉树递归

    2022-02-13 14:12:06
  • Java中ArrayList初始化的四种方法详解

    2022-03-29 21:50:13
  • Android检测Activity或者Service是否运行的方法

    2021-09-03 00:52:00
  • C#后台创建控件并获取值的方法

    2022-10-20 08:39:46
  • Android控件之Spinner用法实例分析

    2022-08-06 08:36:33
  • C#网站生成静态页面的实例讲解

    2021-11-01 16:33:08
  • Android SDK Manager更新、下载速度慢问题解决办法

    2023-10-25 06:03:18
  • C#9.0新特性详解——顶级程序语句(Top-Level Programs)

    2023-07-05 18:46:03
  • Spring Security短信验证码实现详解

    2023-07-04 22:27:07
  • springmvc分层领域模型概念详解

    2021-09-07 01:21:51
  • Hibernate一级缓存和二级缓存详解

    2023-11-16 11:58:11
  • Spring Security基于json登录实现过程详解

    2023-12-07 07:15:18
  • Android自定义软键盘的步骤记录

    2023-04-08 07:05:50
  • java 避免出现NullPointerException(空指针)的方法总结

    2022-08-31 04:15:51
  • Android性能优化之JVMTI与内存分配

    2021-11-06 13:25:06
  • Java使用DateTimeFormatter格式化输入的日期时间

    2023-03-09 04:52:38
  • DirectInfo.GetFiles返回数组的默认排序示例

    2022-11-15 14:45:02
  • MyBatis逆向工程基本操作及代码实例

    2022-12-19 04:09:27
  • Android ADB常用命令总结

    2022-05-24 18:07:42
  • asp之家 软件编程 m.aspxhome.com