Cookie是Web程序中常用的一种会话跟踪技术,实际是客户端浏览器保存的一小段文本信息。Cookie在实际应用中很常见,比如很多网站登录时的“记住我”功能、电子商务网站的“购物车”功能……Session作为另一个常用的会话技术,常与Cookie拿来比较,文末给链接作扩展介绍。下面主要介绍下Cookie的使用:
1. Cookie的有效期设置:setMaxAge(int maxAge)方法。如果maxAge为正数,表示maxAge秒后该Cookie失效;如果maxAge为负数,表示该Cookie只在本浏览器打开的窗口及其窗口内有效,关闭窗口即失效,Cookie的默认有效期为-1,即关闭即失效;如果maxAge为0,表示即时失效,即删除该Cookie。
2. Cookie的修改删除:Cookie没有提供相应的修改删除API,需要修改需要同名Cookie进行覆盖,需要删除则把有效期设置为0即可。
3. Cookie的跨域性:Cookie是不可跨域的,为了隐私安全,不同域名间不可相互访问。不过同级域名下的Cookie可以通过setDomain()方法实现互访。例如:cookie.setDomain(".baidu.com")。
4. Cookie的访问路径:Cookie可以通过setPath()方法设置该Cookie只允许哪个路径下的程序访问。例如cookie.setPath("/")表示允许所有路径下的程序都可以访问。
5. Cookie的安全设置:Cookie可以通过setSecure()方法,把值设置为true则表示浏览器只会在HTTPS和SSL等安全协议中传输此Cookie。
6. Cookie是否允许客户端脚本读取:Cookie可以通过setHttpOnly()方法,设置为true则表示不允许客户端脚本读取Cookie,比如JavaScript。这个可以在一定程度上避免跨站脚本攻击。
介绍得差不多了,下面直接上示例。
示例主要简单模拟登录场景常见的“记住我”功能,实际应用中肯定比这个示例复杂得多,还有很多安全性的考虑。比如将Cookie中存的数据进行加密或者将用户的“记住”信息存在数据库中。下面为了演示用法只做简单处理。
一、登录处理类
package com.research.spring.controller;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframewor