在Web项目中经常遇到Cookie 跨域/路径 就消失的问题,主要是因为Cookie的参数设置不正确:
Cookie是由 Domain, Path, Expire 组成, 域,路径,有效期。下面以Java Spring MVC Controller为例:
<pre name="code" class="html"><pre name="code" class="html">@RequestMapping("/account")
public class AccountController {
@RequestMapping("/login")
public String login( ...) {
// get token
Cookie cookie = new Cookie("token", token);
response.addCookie(cookie);
//******
}
}
在上面语句生成的名字为token的Cookie的path为 "domain/rootPath/account" 当redirect到 domain/rootPath/device时,发现这个Cookie不见了,要想在account和device中共享Cookie的话,只需要通过setPath设置Cookie的path.
@RequestMapping("/account")
public class AccountController {
@RequestMapping("/login")
public String login(HttpServletRequest request, ...) {
// get token
Cookie cookie = new Cookie("token", token);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
//******
}
}
这样token这个Cookie的path就为rootPath,所以就可以在account和device中共享这个Cookie了
同理可以使用Cookie.setDomain()设置Cookie的域名,以及Cookie.setMaxAge()设置Cookie的有效期。上面Cookie的删除方法:
Cookie cookie = new Cookie("token", null);
cookie.setPath(request.getContextPath());
cookie.setMaxAge(0);
response.addCookie(cookie);
这样就可以立即删除上面创建的名为 token 的Cookie了
PS: Cookie.setMaxAge(-1)表示关闭浏览器的时候删除Cookie,也是创建Cookie时候的默认设置。