Cookie处理
Cookie
javax.servlet.http.Cookie
Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。Java Servlet 显然支持 HTTP Cookie。
cookie是通过response的消息头发送到浏览器中(Set-Cookie:)
, 当发送给浏览器的cookie重名时会覆盖之前的cookie
识别返回用户包括三个步骤:
- 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
- 浏览器将这些信息存储在本地计算机上,以备将来使用。
- 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。
编码处理
Servlet Cookie 处理需要对中文进行编码与解码,但是是针对Tomcat8.0及8.0以下的版本,在Tomcat8.5及8.5以后的版本中已经解决了该问题!
HTTP协议中规定了请求信息和响应信息中不能包含中文数据!比如你提交的中文可能会变成这样%E5%BC%A0%E9%A3%9E%E9%A3%9E
将中文数据转成下面这种格式,叫做URL编码:
张飞飞 ---> URL编码 ---> %E5%BC%A0%E9%A3%9E%E9%A3%9E
将下面这种格式再次转回中文数据,叫做URL解码:
%E5%BC%A0%E9%A3%9E%E9%A3%9E ---> URL解码---> 张飞飞
当cookie中保存中文数据,将cookie添加到响应中时,会报一个500异常,如下:
解决方法如下:
-
编码: 中文字符-->url编码
String str = java.net.URLEncoder.encode("中文","UTF-8");
-
解码: url编码-->中文字符
String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8");
Cookie方法
修饰符,返回值 | 方法 | 说明 |
---|---|---|
public String |
getName() |
该方法返回 cookie 的名称。 名称在创建后不能改变。 |
public void |
setValue(String newValue) |
该方法设置与 cookie 关联的值。 |
public String |
getValue() |
该方法获取与 cookie 关联的值。 |
public void |
setMaxAge(int expiry) |
该方法设置 cookie 过期的时间(以秒为单位)。 -1 表示 cookie 将一直持续下去 如果不设置,cookie 只会在浏览器内存 会话中持续有效。 |
public int |
getMaxAge() |
该方法返回 cookie 的最大生存周期(以秒为单位) 默认情况下,-1 表示 cookie 将持续下去, 直到浏览器关闭。 |
public void |
setDomain(String pattern) |
该方法设置 cookie 适用的域.(例如aarons.top) |
public String |
getDomain() |
该方法获取 cookie 适用的域.(例如aarons.top) |
public void |
setPath(String uri) |
该方法设置 cookie 适用的路径。如果您不指定路径, 与当前页面相同目录下的(包括子目录下的) 所有 URL 都会返回 cookie。 |
public String |
getPath() |
该方法获取 cookie 适用的路径。 |
public void |
setSecure(boolean flag) |
该方法设置布尔值, 表示 cookie 是否应该只在加密的 (即 SSL)连接上发送。 |
public void |
setComment(String purpose) |
设置cookie的注释。该注释在浏览器向用户 呈现 cookie 时非常有用。 |
public String |
getComment() |
获取 cookie 的注释,如果 cookie 没有注释则返回 null。 |
Servlet操作Cookie
通过 Servlet 设置 Cookie
// 创建Cookie对象
Cookie cookie = new Cookie("key","value");
// 设置 cookie 过期的时间(1天后失效)
cookie.setMaxAge(60*60*24);
// 把cookie添加到响应头
response.addCookie(cookie);
如果不使用setMaxAge(int expiry)
设置Cookie, Cookie只会贮存在浏览器内存中, 当浏览器关闭后就会失效
请记住,无论是名字还是值,都不应该包含空格或以下任何字符:
[ ] ( ) = , " / ? @ : ;
通过 Servlet 读取 Cookie
要读取 Cookie,您需要通过调用 HttpServletRequest
的 getCookies( )
方法创建一个 javax.servlet.http.Cookie
对象的数组。然后循环遍历数组,并使用 getName()
和 getValue()
方法来访问每个 cookie 和关联的值。
// 获取从浏览器发送过来的Cookie
Cookie[] cookies = request.getCookies();
// 遍历coolies, 并获取每一个cookie的name和value
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
}
通过 Servlet 删除 Cookie
删除 Cookie 是非常简单的。如果您想删除一个 cookie,那么您只需要按照以下三个步骤进行:
- 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
- 使用
setMaxAge(0)
方法设置 cookie 的年龄为零,来删除现有的 cookie。 - 把这个 cookie 添加到响应头。
删除所有cookie:
注意, 浏览器在传输数据的时候, 只会把cookie的key和value传递到服务器, 如果有doman或者path参数, 删除之前要重新传入这些数据才能进行正常删除
// 读取浏览器发送过来的cookie
Cookie[] cookies = request.getCookies();
// 遍历所有cookie, 并设置所有的cookie的过期时间都设置为0
for (Cookie cookie : cookies) {
cookie.setMaxAge(0);
response.setCookie(cookie);
}
cookie工具API
public class CookieUtil {
//1.新增cookie
public static void addCookie(String name, String value, String path, String domain, int maxAge, HttpServletResponse response){
//校验自己完成
Cookie cookie = new Cookie(name,value);
cookie.setPath(path);
cookie.setDomain(domain);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
//2.删除Cookie 0 -1 可以用枚举类型优化一下
public static void deleteCookie(String name, String path, String domain, HttpServletResponse response){
//校验自己完成
Cookie cookie = new Cookie(name,"");
cookie.setPath(path);
cookie.setDomain(domain);
cookie.setMaxAge(0); //后期维护使用枚举
response.addCookie(cookie);
}
//3.根据Cookie的name属性获取Cookie对象
public static Cookie getCookieByName(HttpServletRequest request,String name){
Cookie[] cookies = request.getCookies();
if(cookies !=null && cookies.length>0){
for(Cookie cookie : cookies){
if(name.equalsIgnoreCase(cookie.getName())){
return cookie;
}
}
}
return null;
}
}