跨域访问 - cookies

跨域写入cookie

可以通过URL参数实现跨域cookie写入,例如,www.a.com域需要为www.b.com域写入cookie信息,token=abcd。

清单:实现重定向,URL: http://www.a.com/token?from=http://www.b.com/set_cookie

@WebServlet("/token")
public class TokenGeneratorServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 生成token
        String token = "abcd";

        String cookieName = "token";
        String cookieVal = token;

        //写入本域cookie
       //Cookie cookie = new Cookie(cookieName, cookieVal);
        //cookie.setPath("/");
        //response.addCookie(cookie);

        // 请求的原始来源域
        String from = request.getParameter("from");

        response.sendRedirect(from + "?cname=" + cookieName + "&cval=" + cookieVal); //重定向到目标域
    }

}

清单:实现写入cookie,URL:http://www.b.com/set_cookie

@WebServlet("/set_cookie")
public class SetCookieServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {

        // 将要写入的cookie项,调用者通过参数传递
        String cookieName = request.getParameter("cname");  //cookie的key
        String cookieVal = request.getParameter("cval");  //cookie的value

        // 生成cookie
        Cookie cookie = new Cookie(cookieName, cookieVal);
        cookie.setPath("/");
        response.addCookie(cookie);
    }

}

缺点:只能实现向一个域写入cookie

跨域读取cookie

可以通过js的script标签读取其它域的cookie。

假设页面cookie_reader.jsp 需要读取www.b.com的cookie值token,现在www.b.com域名的网站对外暴露了 URL为http://www.b.com/read_cookies 的API,该API将读取该域所有的cookie键值对,然后把键值对以下面这种形式,返回。

var cookie_key1=cookie_value1; var cookie_key2=cookie_value2

清单:cookie_reader.jsp 读取cookie值:token,并弹窗

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>读取其它域cookie信息</title>

    <!--
        通过script标签执行另一个域实现的读取cookie的方法,
        script标签返回结果将是变量定义形式的js代码,其中每一个变量表示一个cookie项
        这些代码加载后,此页面后续js代码可直接读取已定义的变量值,即各cookie值
     -->
    <script type="text/javascript" src="http://www.b.com/read_cookies"></script>

</head>
<body>

<script type="text/javascript">
    alert(token);
</script>
</body>
</html>

清单:read_cookies API接口

@WebServlet("/read_cookies")
public class ReadCookiesServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {

        Cookie[] cookies = request.getCookies();
        StringBuilder builder = new StringBuilder();

        // 一定要正确设置响应类型,否则可能导致IE不解析js而直接进行下载操作
        response.setContentType("application/javascript");

        if (cookies != null) {
            PrintWriter writer = response.getWriter();
            for (Cookie cookie : cookies) {
                builder.setLength(0);
                // 结果类似于var token='test123';
                builder.append("var ")
                        .append(cookie.getName())
                        .append("=")
                        .append("'")
                        .append(cookie.getValue())
                        .append("'")
                        .append(";");
                writer.write(builder.toString());
            }
        }
    }
}

原文链接

时间: 2017-06-30

跨域访问 - cookies的相关文章

Ajax跨域访问

最近在做一个项目,需要用到跨域访问,在这里将解决问题的过程与大家分享一下. JavaScript出于安全方面的考虑,使用同源策略,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦. 举例如下: URL1 URL2 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js

Ajax跨域访问Cookie丢失问题的解决方法

ajax跨域访问,可以使用jsonp方法或设置Access-Control-Allow-Origin实现,关于设置Access-Control-Allow-Origin实现跨域访问可以参考之前我写的文章<ajax 设置Access-Control-Allow-Origin实现跨域访问> 1.ajax跨域访问,cookie丢失 首先创建两个测试域名 a.fdipzone.com 作为客户端域名 b.fdipzone.com 作为服务端域名 测试代码 setcookie.PHP 用于设置服务端co

PHP 通过设置P3P头来实现跨域访问COOKIE

我的是CentOS的系统(Linux 内核) 编辑HOST  vi /etc/hosts 加入 127.0.0.1        www.a.com 127.0.0.1        www.b.com 首先:创建 a_setcookie.php 文件,内容如下: <?php //header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

request参数-jsonp跨域访问Struts2后台,获取到的数据没有用callback参数包裹是怎么回事啊?

问题描述 jsonp跨域访问Struts2后台,获取到的数据没有用callback参数包裹是怎么回事啊? 前端代码: $.ajax({ url:'http://localhost:8080/OA/json/json.action?orgid=aaa&code=00002', dataType:'jsonp', type:"GET", dataFilter:function(json,me){ alert("dataFiter:"+json); }, cont

跨域访问代理API-yahooapis

你是否遇到了想利用AJAX访问一些公网API,但是你又不想建立自己的代理服务,因为有时我根本就没打算涉及服务端任何代 码,但是讨厌的浏览器的三原策略,阻止了我们的ajax调用. 比如我想访问一个天气的restfull api,如果我直接去GET : $.get("http://m.weather.com.cn/data/101010100.html"); 看见这问题相信大家都不会陌生,也会很自然的得到解决方案,但是我这里真的不想touch任何服务端代码,用jsonp吧,但 是服务端没实

在liferay中用serveResource解决跨域访问问题

简介: 众所周知,跨域问题是十分常见的需求,比如让客户端的ext-js控件可以渲染来自服务器端的json对象.我们可以用很多很多方法来解决,比如jsonP.但是,在liferay中,我们可以用serveResource方法来优雅的解决跨域访问问题. 白板分析: 以下是摘自我在技术讨论会上的白板: 解决方法: 首先编写一段serveResource方法,让其和远端的json对象打交道,它作为中间层可以封装来在远程的json资源,然后提供给本域内的ext-js代码来渲染. 当然了,这里我们的资源必须

如何解决Entity Framework查询匿名对象后的跨域访问

在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递.但是很多时候,我们不需要把整个表的字段都查出来,如果我们直接把整个数据实体查询出来,就极大的影响了性能,所以我们需要通过查询匿名对象或者已经定义的方式,对数据库进行查询: 1.实例使用的数据实体类: publicclass Category {publicint Id { get; set; }publics

用JSONP实现的跨域访问的解决方案

跨域访问一直是困扰很多开发者的问题之一.因为涉及到安全性问题,所以跨域访问默认是不可以进行的,否则假设今天我写了一段js去更改google的图标,明天他写了一段代码去吧google首页的文字全部变成梵文,那还得了? 首先,讲下什么是相同的域.域是这样定义的,协议名+host名+端口号,只有这3个都一样,才能说是同样的域,同样的域里面的访问不受到同源策略限制,你可以用你的js代码任意的去操作资源,但是不同域你就不能这样做了. 解决跨域访问有很多方法,最常见的一种"单向"跨域访问方式是用J

Javascript跨域访问解决方案

由于安全方面的考虑,Javascript被限制了跨域访问的能力,但是有时候我们希望能够做一些合理的跨域访问的事情,那么怎么办呢? 这里分两类情况: 一.基于同一父域的子域之间页面的访问 参见如下3个domain域: 1.taobao.com 2.jipiao.taobao.com 3.promotion.taobao.com 它们有相同的父域 taobao.com 二.基于不同父域页面之间的访问 参见如下3个domain域: 1.taobao.com 2.baidu.com 3.sina.com