cookie技术的最长使用实例就是记住我的功能
学习前注意几点:
- 默认情况下,cookie的存活时间为一次会话(不是0秒),当浏览器关闭时,cookie会清除
- session中的数据保存在服务器,cookie中的数据保存在浏览器
- cookie会以文件的形式保存在磁盘,浏览器中也可以随时查看到,不安全
- 建议cookie中保存的数据加密
- 服务器获取浏览器的cookie,只能是本服务器生成的cookie,不能获取到其他服务器的cookie
cookie的相关方法:
- 创建cookie
Cookie cookie = new Cookie(name, value);
- 设置cookie的存活时间
cookie.setMaxAge(n秒);
- 将cookie保存到浏览器
response.addCookie(cookie);
- 获取浏览器中的所有cookie
Cookie[] cookies = request.getCookies();
实例:通过复选框实现记住我
//得到表单提交的数据
String rememberMe = request.getParameter("rememberMe");
//实现记住我业务
if ("1".equals(rememberMe)) {
// 创建三个cookie
Cookie usernameCookie = new Cookie("username", username);
Cookie passwordCookie = new Cookie("password", password);
Cookie rememberMeCookie = new Cookie("rememberMe", rememberMe);
// 设置存活时间7天,单位:秒。
usernameCookie.setMaxAge(60 * 60 * 24 * 7);
passwordCookie.setMaxAge(60 * 60 * 24 * 7);
rememberMeCookie.setMaxAge(60 * 60 * 24 * 7);
// 写到浏览器
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
response.addCookie(rememberMeCookie);
} else {
// 创建三个name相同的cookie,设置null即清空
Cookie usernameCookie = new Cookie("username", null);
Cookie passwordCookie = new Cookie("password", null);
Cookie rememberMeCookie = new Cookie("rememberMe", null);
// 将三个cookie的存活时间设置为0
usernameCookie.setMaxAge(0);
passwordCookie.setMaxAge(0);
rememberMeCookie.setMaxAge(0);
// 写到客户端,会覆盖之前同名的cookie
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
response.addCookie(rememberMeCookie);
}
//在login的界面
String username = "";
String password = "";
String rememberMe = null;
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("username")) {
username = cookie.getValue();
}
if (cookie.getName().equals("password")) {
password = cookie.getValue();
}
if (cookie.getName().equals("rememberMe")) {
rememberMe = cookie.getValue();
}
}
再将得到的值放入表单的value属性中
cookie技术的补充:
通常我们做类似于博客系统的软件,会在首页设置很多个性化的设置,建多个cookie不合理,这是我们选择使用alibaba的fastjson去将我们的设置对象转成json
LoginCookie loginCookieObject = new LoginCookie(username, password, Integer.valueOf(rememberMe));
String loginCookieJson = JSON.toJSONString(loginCookieObject);
注意:此时不可直接保存,因为cookie协议中不允许包含"符号
RFC6265 Cookie values may not contain character: ["]
我们需要采用编码:
String loginCookieEncode = URLEncoder.encode(loginCookieJson, "utf-8");
创建cookie
Cookie loginCookie = new Cookie("loginCookie", loginCookieEncode);
//设置生命周期
loginCookie.setMaxAge(60 * 60 * 24 * 7);
//写到浏览器
response.addCookie(loginCookie);
得到cookie
<%
LoginCookie loginCookie = new LoginCookie("", "", 0);
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("loginCookie")) {
//解码,json转Object
loginCookie = JSON.parseObject((URLDecoder.decode(cookie.getValue(), "utf-8")), LoginCookie.class);
}
}
%>