经过nginx转发之后的跨域名携带和设置cookie
本文由 小茗同学 发表于 2017-03-08 浏览(16665)
最后修改 2017-03-18 标签:nginx 跨域 cookie

概况

之前有个疑问:假如某个页面地址和接口地址是跨域的,直接请求肯定无法正确携带和设置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}");
%>