- cookie 在项目里经常使用,一个cookie在由一个服务器产生在另一个服务器里需要用到,这就产生了cookie的跨域问题。
- 由于浏览器安全策略,cookie只能在同一域名产生和使用。
- 看一个cookie的组成:
- 可以看到首先是cookie的name,value。
- Domain 是指cookie的域名。当访问localhost 的接口时会自动携带cookie。
- 跨域:指前端页面和前端要访问的接口不在同一个域名下,就产生了跨域问题。
- domain 设置为 test.com ,那么访问a.test.com 页面去访问b.test.com 就可以携带cookie,后端通过设置Cross,前后端都需要设置Credentials为true,这样就可以携带a的cookie给b 的后端。
- 后端设置cross:
@Component public class CrossFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 跨域 String origin = httpRequest.getHeader("Origin"); // 这里不能使用addHeader 方法,使用setHeader,获取到的httpResponse,已经携带Access-Control-Allow-Origin // 这个头,默认为 * if (origin == null) { httpResponse.setHeader("Access-Control-Allow-Origin", "*"); } else { httpResponse.setHeader("Access-Control-Allow-Origin", origin); } httpResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Cookie"); httpResponse.addHeader("Access-Control-Allow-Credentials", "true"); httpResponse.addHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE"); if ( "OPTIONS".equals(httpRequest.getMethod())) { httpResponse.setStatus(HttpServletResponse.SC_OK); return; } chain.doFilter(request, response); } catch (Exception e) { throw e; } } @Override public void init(FilterConfig arg0) throws ServletException { } }
-
前端vue 设置在main.js里,
axios.defaults.withCredentials = true; //让ajax携带cookie