cookie跨域访问?(转)

开发2web应用,分别为web1web2,

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然后输出namevalue到控制台,并创建一个cookie,web2则只获取cookie然后输出namevalue到控制台,这两个应用功能非常好理解。

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浏览器,并且开启了2360浏览器的实例(非多标签),诡异的一幕出现了,访问web2应用的时候无法获得web1应用创建的cookie,试了好多方法都不行,后来用360浏览器多标签的方式:

访问测试了一下结果发现从web2可以访问到web1创建的cookie,回想当初学习cookie知识的时候想到了一个细节,如果cookiemaxAge默认不设置的话,cookie默认是存储在浏览器的内存(缓存)当中的,web1创建的cookie就没有设置这个属性,因此得出360浏览器开启多个实例的情况下其各自都自己的内存空间,IE8则不然,多标签或多实例都共用一个内存,那么如果想使用360浏览器多实例共享cookie的办法只有给cookie设置maxAge属性了(这样cookie会存储到磁盘中),因此web1index.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\etchosts文件中添加如下内容:

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然后查看其maxAgepathdomain等属性发现它的值可能是null,这是由应用服务器内部实现类决定的,这不代表你存进去的也是null,通过httpwatch是可以查看到cookie这些属性值的。

第三个测试开始,与第二个类似,但域名要稍稍改变一下,

C:\WINDOWS\system32\drivers\etchosts文件中添加如下内容:

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,原因如下:

访问web1cookiedomain没有设置,那么默认为web1.myweb.com,根据cookie不能跨域访问的规则,访问web2web2.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);

分别访问web1web2,一切正常,web2又可以访问的web1cookie,至此第三个测试结束,证明了一()级域名相同的情况下,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\etchosts文件中添加如下内容:

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应用的时候无法获得web1cookie,再访问http://www.web1com/web2

(注意红色字),这时cookie又出来了,结论如下:cookiedomain默认即为浏览器访问输入的内容,是域名即域名内容,ip地址即为ip地址,不同ip地址、一级域名不同的应用之间不能共享cookie,这是cookie的规范,没有办法,无论你怎么设置domain都是徒劳的,所以做企业应用实施过程中2个应用要通过cookiesso,一定要让其一级域名相同(客户不一定会听你的),否则赶紧想其他办法,不要在这浪费时间了,真正的跨域sso不是单纯靠cookie就能做到的




 

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值