您的位置:首页 > 编程语言 > Java开发

java Cookie操作

2016-04-13 10:40 417 查看
 java中Cookie的使用

原文:http://shukuiyan.iteye.com/blog/1587075

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的值只在浏览器的会话期间存在,当用户退出浏览器这些值就消失了。

                  cookie.setMaxAge(0);//不记录cookie

                   cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效(session-JSESSIONID就是这种会话级)

                   cookie.setMaxAge(60*60);//过期时间为1小时

path---------指定与Cookie关联在一起的网页.默认情况下,cookie会和创建它的网页以及与这个网页处于同一个目录下的网页和处于该目录下的子目录关联。

domain-----设置访问域。举个例子:位于a.example.com的服务器要读取b.example.com设置的cookie.这里就要引入domain属性,

               假定由位于a.example.com的页面创建的cookie把自己的path属性设置为"/",把domain属性设置为".example.com",那么所有位于"a.example.com"的网页和所有位于"b.example.com"的网页以及所有位于example.com域的其他服务器上的网页都能够访问这个cookie.

               如果没有设置cookie的domain值,该属性的默认值就是创建cookie的网页所在服务器的主机名。

               注意:不能将一个cookie的域设置成服务器所在的域之外的域.

               ***cookie,domain设置成顶级域名,浏览器是不存储的;

               ***cookie不能跨二级域名设置;

seure------指定在网络上如何传输cookie的值
3、java Cookie操作
1.创建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  
2.读取cookie

读取Cookie只能从request中获取全部Cookie,然后循环迭代。

// 从request中获取Cookie,拿到的是一个Cookie数组  

Cookie[] cookies = request.getCookies();  

// 然后迭代之  

for (Cookie cookie : cookies) {

    cookie.getName();

    cookie.getValue();


3.删除cookie

删除Cookie的话,只需要将Cookie的生存期设为0即可

Cookie[] cookies = request.getCookies();  

if (cookies != null && cookies.length > 0) {  

    for (Cookie cookie : cookies) {  

        String name = cookie.getName();  

        // 找到需要删除的Cookie  

        if("需要删除的cookie key name".equals(cookie.getName())){

            // 设置生存期为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下面获取到webapp_a设置的cookie了。

3)此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp),因此cookie.setPath("/")之后,

   可以在webapp文件夹下的所有应用共享cookie,而cookie.setPath("/webapp_b/");

   是指webapp_a应用设置的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://blog.csdn.net/ghsau/article/details/20395681
1.Cookie组成

 cookie是由名称、内容、作用路径、作用域、协议、生存周期组成,另外还有个HttpOnly属性,HttpOnly属性很重要,如果在cookie中设置了HttpOnly属性,那么通过js脚本(document.cookie)将无法读取到cookie信息,这样能一定程度上的防止XSS攻击,
 Tomcat服务器设置的JSESSIONID就是HttpOnly的。

 javax.servlet.http.Cookie类

该类可以设置cookie的名称、内容、作用路径、作用域、协议、生存周期,but不能设置HttpOnly属性,不知道这么做是出于什么考虑,如果非要设置HttpOnly的cookie,我们可以通过响应头来处理:

response.setHeader("Set-Cookie", "cookiename=value;Path=/;Domain=domainvalue;Max-Age=seconds;HttpOnly");  

2.Cookie作用域

测试Cookie的作用域需要弄几个域名,修改C:\Windows\System32\drivers\etc\hosts文件,将本机ip映射出四个域名,如下:

127.0.0.1 web1.ghsau.com  

127.0.0.1 web2.ghsau.com  

127.0.0.1 web1.com  

127.0.0.1 web2.com  

前两个是2级域名(ghsau.com)相同,3级域名(web1、web2)不同,后两个是2级域名不同。然后我们再写两个jsp,一个用于设置Cookie,另一个用于显示Cookie。

SetCookie.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>  

<%  

    Cookie cookie = new Cookie("test_key", "test_value");  

    cookie.setPath("/");  

//  cookie.setDomain(".ghsau.com");  

    response.addCookie(cookie);  

%>

ShowCookie.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>  

<%  

    // 输出cookies,过滤掉JSESSIONID  

    Cookie[] cookies = request.getCookies();  

    if(cookies != null)  

        for(Cookie cookie : cookies) {  

            if(cookie.getName().equals("JSESSIONID"))    continue;  

            out.println(cookie.getName() + "-" + cookie.getValue());  

        }  

%>

将这两个jsp放到应用后,部署到服务器中,启动服务器,我们就可以通过域名来访问了。

测试一,首先访问http://web1.ghsau.com:8080/WebSSOAuth/SetCookie.jsp,设置cookie后,再访问http://web1.ghsau.com:8080/WebSSOAuth/ShowCookie.jsp,页面输出test_key=test_value,这时我们访问http://web2.ghsau.com:8080/WebSSOAuth/ShowCookie.jsp,发现页面什么都没有输出,这时我们得出结论,cookie默认情况下作用域为当前域名。

测试二,将SetCookie.jsp第五行注释打开,按照上面的顺序依次访问,我们发现http://web2.ghsau.com:8080/WebSSOAuth/ShowCookie.jsp中输出了http://web1.ghsau.com:8080/WebSSOAuth/SetCookie.jsp中设置的cookie,这时我们得出结论,cookie作用域为父级域名时,所有子级域名都可以得到该cookie,这也是实现跨子域SSO的关键。这时有些朋友可能会想到那我把cookie作用域设置到顶级域名(.com、.net)上,是不是用该顶级域名的网站就都能获取该cookie了?这样设置的cookie,浏览器是不存储的,无效的cookie。

测试三,修改SetCookie.jsp第五行代码为cookie.setDomain(".web2.com"),首先访问http://web1.com:8080/WebSSOAuth/SetCookie.jsp,设置cookie后,这时我们访问http://web2.com:8080/WebSSOAuth/ShowCookie.jsp,发现页面什么都没有输出,这时我们得出结论,cookie不能跨二级域名设置

3.Cookie安全性

cookie中的数据通常会包含用户的隐私数据,首先要保证数据的保密性,其次要保证数据不能被伪造或者篡改,基于这两点,我们通常需要对cookie内容进行加密,加密方式一般使用对称加密(单密钥,如DES)或非对称加密(一对密钥,如RSA),密钥需要保存在服务器端一个安全的地方,这样,别人不知道密钥时,无法对数据进行解密,也无法伪造或篡改数据。另外,像上文提到的,重要的cookie数据需要设置成HttpOnly的,避免跨站脚本获取你的cookie,保证了cookie在浏览器端的安全性。

还有我们可以设置cookie只作用于安全的协议(https),JavaEE中可以通过Cookie类的setSecure(boolean flag)来设置,设置后,该cookie只会在https下发送,而不会在http下发送,保证了cookie在服务器端的安全性,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cookie