下面是我的跨域方式:
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();