概况
之前有个疑问:假如某个页面地址和接口地址是跨域的,直接请求肯定无法正确携带和设置cookie,但是如果通过nginx或者fiddler进行一层转发使之变成同域呢?
下面我们来验证。
假设接口原地址是:http://a.com/test.json ,且设置了允许跨域,现在我在 http://b.com/index.html 下请求这个接口,很显然,可以调用成功,但是携带的是 http://a.com 域名下的cookie,而且response
中的Set-Cookie
最终也只会写到 http://a.com 的域名下,那么假如我们通过nginx做一层转发转发到同域名下呢?
假设我们把 http://a.com/test.json 转发到 http://b.com/forward.json ,然后再在 http://b.com/index.html 下面调用,经测试均可以携带cookie,并且服务端设置的Cookie也能够正常写入。
以下是用JSP写的测试接口,仅做记录用:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
Cookie[] cookies = request.getCookies();
if(cookies != null)
{
for(int i=0; i<cookies.length; i++)
{
System.out.println(cookies[i].getName()+":"+cookies[i].getValue());
}
}
Cookie cookie = new Cookie("test_write_cookie", "aaabbb");
cookie.setPath("/");
cookie.setMaxAge(60 * 60 * 24 * 7);
response.addCookie(cookie); // 测试写入cookie
// 为了方便查看效果对比,我们开启跨域
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
response.setContentType("application/json;charset=UTF-8");
out.println("{\"code\": 0}");
%>