`
pengfeifei26
  • 浏览: 241257 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java session and cookie

 
阅读更多
http://blog.csdn.net/fangaoxin/article/details/6952954

http://www.360doc.com/content/13/0507/16/11042_283646451.shtml

web1应用的web根下创建一个index.jsp,内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
   
    Cookie[] cookies = request.getCookies();
    if(cookies != null && cookies.length > 0){
        for(int i=0;i<cookies.length;i++){
            Cookie cookie = cookies[i];
            System.out.println("web1----cookie name:"+cookie.getName()+" value:"+cookie.getValue());
            if("myCookieName".equals(cookie.getName())){//如果cookie已存在则删除掉
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
        }
    }
    //用java代码创建cookie的方法如下,构造的参数是cookie的name和value
    Cookie cookie = new Cookie("myCookieName","myCookieValue1");
    cookie.setPath("/");
    response.addCookie(cookie);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    This is web1's index.jsp
</body>
</html>

web2应用的web根下创建一个index.jsp,内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
   
    Cookie[] cookies = request.getCookies();
    if(cookies != null && cookies.length > 0){
        for(int i=0;i<cookies.length;i++){
            Cookie cookie = cookies[i];
            System.out.println("web1----cookie name:"+cookie.getName()+" value:"+cookie.getValue());
            if("myCookieName".equals(cookie.getName())){//如果cookie已存在则删除掉
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
        }
    }
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    This is web2's index.jsp
</body>
</html>


2个应用基本一样,web1负责获取系统中的cookie然后输出name和value到控制台,并创建一个cookie,web2则只获取cookie然后输出name和value到控制台,这两个应用功能非常好理解。
2个应用部署到一个tomcat下,端口为80,两个应用的访问路径分为别:
http://127.0.0.1/web1 和 http://127.0.0.1/web2 接下来是测试过程

首先用IE8访问web1,为了看到我们创建的cookie,所以需要多刷新几下,这时控制台输出如下(去除重复项后):
web1----name:JSESSIONID value:D402D19B22D8E3437ECF36785B0853E1
web1----name:myCookieName value:myCookieValue1


清空控制台日志,然后用IE8访问web2,这时控制台输出如下:
web2----name:JSESSIONID value:3E7B632C0074FD5EBA409005271EAC9C
web2----name:myCookieName value:myCookieValue1


这时说明2个应用是共享cookie的,但此时并没有实现cookie的跨域访问
以上同样的测试我换成了360浏览器,并且开启了2个360浏览器的实例(非多标签),诡异的一幕出现了,访问web2应用的时候无法获得web1应用创建的cookie了,试了好多方法都不行,后来用360浏览器多标签的方式:

访问测试了一下结果发现从web2可以访问到web1创建的cookie了,回想当初学习cookie知识的时候想到了一个细节,如果cookie的maxAge默认不设置的话,cookie默认是存储在浏览器的内存(缓存)当中的,web1创建的cookie就没有设置这个属性,因此得出360浏览器开启多个实例的情况下其各自都自己的内存空间,而IE8则不然,多标签或多实例都共用一个内存,那么如果想使用360浏览器多实例共享cookie的办法只有给cookie设置maxAge属性了(这样cookie会存储到磁盘中),因此web1的index.jsp代码调整了一下:
Cookie cookie = new Cookie("myCookieName","myCookieValue1");
cookie.setPath("/");
cookie.setMaxAge(180);//设置存活周期为3分钟
response.addCookie(cookie);

再次测试,发现web2已经可以访问到web1创建的cookie了,并且在3分钟后再次刷新web2应用发现cookie失效(补充一点,cookie的失效不需要服务器监控其生命周期,通常浏览器自己会处理),一切正常,至此第一个测试内容结束。

第二个测试内容开始,问题是这样,实际项目中客户不会使用ip地址访问应用系统的,一般都会设置域名,因此准备用域名访问一下我这两个应用,测试方式:
在C:\WINDOWS\system32\drivers\etc的hosts文件中添加如下内容:
127.0.0.1 www.myweb.com
这样在浏览器中访问www.myweb.com时首先会到hosts文件中查找,找不到才会使用DNS去解析,使用这种方法进行测试,分别访问:
http://www.myweb.com/web1 和 http://www.myweb.com/web2
结果也是一切正常,但通过httpwatch监控发现如果cookie不设置domain的话,默认则为当前域名,即:www.myweb.com(记住这个,很重要),两个应用使用同一个域名,所以cookie同样可以共享,也证明了域名后边斜线之后的内容是不影响cookie的,至此第二个测试内容结束,这里也补充说一句如果你用代码获取cookie然后查看其maxAge、path、domain等属性发现它的值可能是null,这是由应用服务器内部实现类决定的,这不代表你存进去的也是null,通过httpwatch是可以查看到cookie这些属性值的。

第三个测试开始,与第二个类似,但域名要稍稍改变一下,
在C:\WINDOWS\system32\drivers\etc的hosts文件中添加如下内容:
127.0.0.1 web1.myweb.com
127.0.0.1 web2.myweb.com
然后使用IE8分别访问:
http://web1.myweb.com/web1 和 http://web2.myweb.com/web2
测试结果:web2应用无法访问到web1应用创建的cookie,原因如下:
访问web1时cookie的domain没有设置,那么默认为web1.myweb.com,根据cookie不能跨域访问的规则,访问web2时web2.myweb.com域自然不能访问web1.myweb.com域的cookie,但其一(顶)级域名(myweb.com)是相同的,这时候有办法可以解决,即将web1的代码修改如下:
Cookie cookie = new Cookie("myCookieName","myCookieValue1");
cookie.setPath("/");
cookie.setMaxAge(180);//设置存活周期为3分钟
cookie.setDomain(".myweb.com");
response.addCookie(cookie);
分别访问web1和web2,一切正常,web2又可以访问的web1的cookie了,至此第三个测试结束,证明了一(顶)级域名相同的情况下,cookie是可以实现二级(三级以上也可以)域名应用跨域访问的。(补充说一句,确定域名是几级的最简单办法是数域名中有几个点,比如baidu.com是一级域名而www.baidu.com就是二级域名以此类推,而www.baidu.com/index.php红色字体部分不属于域名,所以这部分也不会影响cookie)


第四个测试内容比较重要,要模拟的是2个应用的一级域名不同的情况,比如web1应用域名为:www.web1.com 而web2的域名为www.web2.com,还是使用hosts文件模拟不同域名访问情况,在C:\WINDOWS\system32\drivers\etc的hosts文件中添加如下内容:
127.0.0.1 www.web1.com
127.0.0.1 www.web2.com
然后使用IE8分别访问http://www.web1.com/web1 和 http://www.web2.com/web2
结果证实,访问web2应用的时候无法获得web1的cookie,再访问http://www.web1com/web2
(注意红色字),这时cookie又出来了,结论如下:cookie的domain默认即为浏览器访问输入的内容,是域名即域名内容,是ip地址即为ip地址,不同ip地址、一级域名不同的应用之间不能共享cookie,这是cookie的规范,没有办法,无论你怎么设置domain都是徒劳的,所以做企业应用实施过程中2个应用要通过cookie做sso,一定要让其一级域名相同(客户不一定会听你的),否则赶紧想其他办法,不要在这浪费时间了,真正的跨域sso不是单纯靠cookie就能做到的,后续准备整理一些比较好的跨域sso方案共享出来。
分享到:
评论

相关推荐

    **session and cookie

    WebX是一个基于Java的开源MVC框架,它提供了内置的Session管理和Cookie操作支持。开发者可以通过WebX提供的API方便地创建、读取、更新和删除Session数据,以及设置和获取Cookie值。具体细节需要查阅文档或源码了解。...

    session and cookies.ppt

    当用户访问网站并进行交互时,服务器为每个用户创建一个唯一的Session ID,这个ID会被存储在用户的浏览器中,通常是通过Cookie。每当用户请求新的页面时,这个Session ID会随请求一起发送到服务器,服务器根据ID找到...

    学习cookie的笔记和总结

    2. **浏览器存储Cookie:** 浏览器接收到这些Cookie后,会将它们保存在用户的计算机上(通常是`C:\Documents and Settings\[当前用户]\Cookies`目录下)。 3. **浏览器发送Cookie:** 当用户再次访问同一网站时,...

    java编写bbs源码

    Session 和 Cookie 是 Web 应用中常见的用户状态管理手段。 5. **Spring 框架**:Spring 是一个广泛使用的 Java 框架,提供依赖注入、AOP(面向切面编程)、事务管理等功能。在 BBS 系统中,Spring 可以简化对象的...

    java面试题 web corejava

    8. **JNDI(Java Naming and Directory Interface)**: - JNDI提供了一种查找和访问资源的接口,如数据库连接池、邮件服务器等。 - 学习如何在Java Web中配置和使用JNDI。 9. **HTTP协议**: - 对HTTP协议的...

    JSP单元测试题JNDI JAVA Naming and Directory interface

    【JSP单元测试题JNDI -JAVA Naming and Directory interface】 JNDI(JAVA Naming and Directory interface)是Java平台提供的一套接口和API,用于访问各种命名和目录服务,如DNS、LDAP等。通过JNDI,开发者可以...

    java实现登录操作

    本文将详细讲解如何在Java中实现登录功能,包括设置和读取Cookie以及进行用户登录验证。 首先,理解Cookie的概念是至关重要的。Cookie是一种小型文本文件,由服务器发送到用户的浏览器,并由浏览器保存,用于在后续...

    JAVA EE知识串讲

    Session在服务器端维护,每个用户会被分配一个唯一的Session ID,这个ID会被发送到客户端(通常是通过Cookie)。当用户发送请求时,携带这个Session ID,服务器就能识别出是哪个用户的请求,从而保持用户的登录状态...

    java web 课件

    Java Web 是一种用于构建动态网站和企业级应用程序的技术,它基于Java编程语言,结合了多种组件和服务,如Servlet、JSP(JavaServer Pages)、JavaBeans、JNDI(Java Naming and Directory Interface)等。...

    基于Java的网上拍卖系统.rar

    Session用于存储服务器端的数据,而cookie则是在客户端保存的小型数据。 6. **AJAX异步通信**:为了提供更好的用户体验,拍卖系统可能会使用AJAX(Asynchronous JavaScript and XML)技术实现页面的部分刷新,使...

    session,sql分页

    每个`session`都有一个唯一的ID,这个ID通过cookie存储在客户端浏览器,每次请求时发送回服务器,以便服务器识别并恢复相应的用户信息。这样,即使在HTTP协议的无状态特性下,服务器也能记住用户的状态。 实现`...

    java web试题

    10. **JNDI(Java Naming and Directory Interface)**: JNDI是Java中的一组API,用于查找和管理分布式环境中的资源,如数据库连接池、邮件服务器等。在Java Web应用中,JNDI常用于查找和绑定资源。 以上就是关于...

    Java web 调查问卷

    15. **Session和Cookie管理**:在Web应用中,Session和Cookie用于跟踪用户状态,实现会话管理。 以上是Java Web开发中的关键知识点,涵盖了从基础到高级的各种概念和技术。对于"Java Web 调查问卷",可能涉及的调查...

    运用JAVA编写的 在线考试系统

    5. **session和cookie**:为了维持用户的登录状态和个性化设置,系统会使用session或cookie来存储用户信息。session在服务器端存储,安全性较高,而cookie存储在客户端,易于读取但存在安全风险。 6. **权限控制**...

    Java Web BBS论坛系统

    4. **session和cookie**:为了保持用户登录状态,BBS系统通常会使用session或cookie来跟踪用户信息。Session存储在服务器端,安全性较高,而cookie存储在客户端,适用于存储非敏感信息。 5. **标签库(Tag ...

    《Java Web应用开发技术实用教程》-电子教案+源码

    7. Session和Cookie管理:在Web应用中,Session和Cookie常用于跟踪用户的会话状态。Session存储在服务器端,适合存储大量或敏感数据,而Cookie存储在客户端,适用于少量非敏感信息的传递。 8. AJAX异步通信:AJAX...

    java web开源项目在线考试系统

    6. **Session与Cookie管理**: 为了保持用户状态,系统会使用Session或Cookie技术。Session存储在服务器端,用于保存用户登录状态、购物车等信息;Cookie则存储在客户端,用于识别用户和提供个性化服务。 7. **前端...

    浅谈cookie和session(小结)

    cookie和session是Java Web开发中两个非常重要的概念,本篇文章将对它们进行探究和总结。 Cookie Cookie是浏览器层面的东西,存在于浏览器的请求头中,以键值对(数组)的形式存在。只要有请求,就会在请求头携带...

    java+mysql系统

    2. **安全机制**:考虑到企业级应用,系统可能包含了用户认证和授权功能,如session管理、cookie使用、HTTPS加密通信等。 3. **性能优化**:系统可能包含缓存策略、数据库连接池、负载均衡等手段,以提高系统性能和...

Global site tag (gtag.js) - Google Analytics