一、概述
二、跨域读写Cookie
2.1 利用HTML的script标签跨域写Cookie
比如当前域是www.a.com,下面的script标签是跨域写cookie的核心,通过此标签实现了向www.b.com域写入cookie:
<script type="text/javascript" src="http://www.b.com/setCookie?cname=token&cval=123456"></script>
P3P协议
P3P是一种被称为个人隐私安全平台项目(the Platform for Privacy Preferences)的标准,能够保护在线隐私权,使Internet冲浪者可以选择在浏览网页时,是否被第三方收集并利用自己的个人信息。如果一个站点不遵守P3P标准的话,那么有关它的Cookies将被自动拒绝,并且P3P还能够自动识破多种Cookies的嵌入方式。p3p是由全球资讯联盟网所开发的。
举个例子:
我们在访问A网站时,理论上说,我们只能把Cookie信息保存到A站域名下,而不能写入到B网站下。如果想要跨域读写Cookie,只是通过script标签变相访问B网站在一些浏览器是行不通的,此时B网站的服务器应该告诉浏览器允许A网站写入Cookie,否则浏览器将会拒绝执行,这就是P3P协议。
服务端如何告诉浏览器?
P3P提供了一种简单的方式 ,来加载用户隐私策略,只要在http响应的头信息中增加
response.setHeader("P3P","CP=NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC);
而无需指定隐私策略文件也可以达到指定隐私策略的目的。 CP=后面的字符串分别代表不同的策略信息。
总结
因为P3P协议所以不能保证所有浏览器都能通过script标签方式跨域写Cookie,有的浏览器本身就是拒绝跨域的。
显然这种方式是不能保证跨域写cookie的成功性。
2.2 通过URL参数实现跨域信息传递
我们要在A域实现写入token到B域,需要在A域设计一个servlet接收请求,代码:
Copy
@WebServlet(name = "tg") public class Servlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { //获取请求的目标域 String from = request.getParameter("from"); //生成token, String token = "123456"; //重定向到目标域 response.sendRedirect(from + "?cname=token&cval=" + token); } ... }
由a域发起请求,请求地址:http://www.a.com/tg?from=http://www.b.com/set_cookie, 请求后该Servlet会获取from参数的值并生成token最后让客户端重定向到http://www.b.com/set_cookie?cname=token&cval=123456,然后B域的Servlet("set_cookie")获取Url参数写入Cookie到客户端,代码:
Copy
//将要写入的cookie项,调用者通过参数传递 String cookieName = request.getParameter("cname"); String cookieValue = request.getParameter("cval"); //生成cookie Cookie cookie = new Cookie(cookieName,cookieValue); cookie.setPath("/"); //一般可以将domain设置到顶级域 //cookie.setDomain("www.b.com"); response.addCookie(cookie);
这时候再查看B域下的Cookie就可以发现(token=123456)已经被写入到浏览器。
三、
四、小结