关于cookie跨域的问题求教
下面是我的跨域方式:
a工程:middle.jsp
<body>
<%
Cookie[] cs=request.getCookies();
Cookie sCookie=null;
String user=null;
if(cs!=null){
for(int i=0;i<cs.length;i++){
sCookie=cs[i];
if(sCookie!=null){
if(("_USER").equals(sCookie.getName())){
user=sCookie.getValue();
}
}
}}
String backurl=request.getParameter("backurl");
response.addHeader("Cache-Control","no-cache");
response.addHeader("Expires","Thu,01 Jan 1970 00:00:01 GMT");
URLEncoder.encode(ulk,"utf-8");
%>
<script src="http://www.b.com/setCookie.jsp?user=<%=user %>"> </script>
<script type="text/javascript">
window.location="<%=backurl%>";
</script>
</body>
b工程:setCookie.jsp
<%
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"");
String user= request.getParameter("user");
user=URLEncoder.encode(URLDecoder.decode(user, "utf-8"),"utf-8");
Cookie _USER=new Cookie("_USER",user);
_cookie.setPath("/");
_cookie.setDomain(".b.com");
response.addCookie(_USER);
%>
通过这种方式是实现了在b.com 中取到_user这个cookie,问题是我在a工程中多了一步加载middle.jsp页面,然后才能跳转到backurl的页面。这样是极不友好的,我用ajax直接请求middle.jsp 无法在b中获取的cookie。同理我退出的时候也用这种方式,页面又要重新加载,用户体验极佳。
求更好的解决cookie跨域的方案呢?求大侠们指点迷津啊!!!!! java web cookie p3p 跨域
[解决办法]
这只是重新设置设置b站的cookie,算不上跨域
ajax请求url后返回的script是不会执行的,所以设置b域名的cookie的<script src="http://www.b.com/setCookie.jsp?user=<%=user %>"> </script>没有执行
你这个要求可以用jsonp来实现,原理参考参考这个:jQuery jsonp跨域原理
a站点ajax验证成功后返回用户名,动态创建script来加载“http://www.b.com/setCookie.jsp?user=ajax返回的用户名”这个url地址设置b站cookie,并设置一个回调函数给b站点调用【window作用域下的】,转向用的,而不是ajax验证完成后直接用转向,要不动态创建的script没加载完毕就被卸载了导致b站点cookie设置不成功
b站点setCookie.jsp设置cookie完后输出js脚本执行回调跳转,就是调用a站点注册的那个回调函数执行跳转
[解决办法]
大概帮你写了个模型,java不会,动态页只能帮你描述功能了
在a站点登陆的时候就需要同时设置b站点的cookie
a站点登陆页面login.html用ajax请求check.jsp页面验证用户信息,验证成功后设置a站点的cookie
当a站点验证身份的ajax返回成功后,用script加载b站点的设置cookie的动态页,b站点设置cookie的页面执行完后输出js代码执行a站点的提供的回调函数进行转向
a站点,login.html主要js代码,登陆表单自己弄了
<script>
//ajax验证用户身份的函数
function check(un, pwd) {
var xhr = window.ActiveXObject ? new ActiveXObject("microsoft.xmlhttp") : new XMLHttpRequest();
xhr.open("get", "check.jsp?un=" + un + '&pwd=' + pwd + '&_dc=' + new Date().getTime(), true); //加时间戳防止缓存
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) { //成功执行
if (xhr.responseText.indexOf('ok') != -1) {//密码用户名正确
SetBSiteCookie(un); //用script动态加载b站点设置cookie的setcookie.jsp页面设置b站点的cookie
}
else alert('用户名或者密码错误!');
}
else alert('check.jsp页面有错误,返回信息如下\n' + xhr.responseText);
}
}
xhr.send(null);
}
function DoRedirect() { //加载b站点cookie成功后再进行转向的回调函数
window.location = 'a站验证成功并且b站也成功设置cookie后需要转向到的页面地址';
}
function SetBSiteCookie(un) {//动态加载b站点设置cookie的页面
var h = document.getElementsByTagName('head')[0];
var s = document.createElement('script');
s.type = 'text/javascript';
s.src = 'http://www.b.com/setCookie.jsp?user=' + un + '&_dc=' + new Date().getTime();//加时间戳防止缓存
h.appendChild(s);
}
</script>
<%
//java不会,说思路
//获取ajax get提交的参数un和pwd进行身份验证
//验证通过则设置a站点的cookie,并输出ok,不要输出其他的
%>
<%
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"");
String user= request.getParameter("user");
user=URLEncoder.encode(URLDecoder.decode(user, "utf-8"),"utf-8");
Cookie _USER=new Cookie("_USER",user);
_cookie.setPath("/");
_cookie.setDomain(".b.com");
response.addCookie(_USER);
%>
DoRedirect();//就增加这句就行了
#7我就写出来给你了,不要有其他的html代码,因为你是通过script标签加载的动态页,只能输出符合js语法的语句才行
<%
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"");
String user= request.getParameter("user");
user=URLEncoder.encode(URLDecoder.decode(user, "utf-8"),"utf-8");
Cookie _USER=new Cookie("_USER",user);
_cookie.setPath("/");
_cookie.setDomain(".b.com");
response.addCookie(_USER);
%>
DoRedirect();//就增加这句就行了