1. 介绍
- Cookie 是服务器通知客户端保存键值对的一种技术。
- 客户端有了 Cookie 后,每次请求都发送给服务器。
- 每个 Cookie 的大小不能超过 4kb。
2. 如何创建Cookie
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 创建Cookie对象
Cookie cookie = new Cookie("key4", "value4");
//2 通知客户端保存Cookie resp.addCookie(cookie);
//1 创建Cookie对象 Cookie cookie1 = new
Cookie("key5", "value5");
//2 通知客户端保存Cookie resp.addCookie(cookie1);
resp.getWriter().write("Cookie 创建成功"); }
3. 服务器获取Cookie
服务器获取客户端的 Cookie 只需要一行代码:req.getCookies()
4. Cookie 值的修改
方案一:
- 创建一个要修改的同名(指的就是 key)的 Cookie 对象
- 在构造函数,同时赋于新的 Cookie 值
- 调用
response.addCookie(Cookie)
方案二:
- 查找到需要修改的 Cookie 对象
- 调用
setValue()
方法赋于新的 Cookie 值 - 调用
response.addCookie()
通知客户端保存修改
protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决乱码问题
response.setContentType("text/html; charset=UTF-8");
//方法一
Cookie cookie = new Cookie("key1","newValue11");
response.addCookie(cookie);
response.getWriter().println("修改完毕");
Cookie[] cookies = request.getCookies();
//方法二
Cookie cookieIWant = null;
for (Cookie findcookie:cookies){
if("key2".equals(findcookie.getName())){
cookieIWant = findcookie;
//Cookie值不支持空格等符号和中文
cookieIWant.setValue("newvalue222");
response.addCookie(cookieIWant);
break;
}
}
}
5. Cookie 生命控制
Cookie 的生命控制指:管理 Cookie 什么时候被销毁
方法:通过使用setMaxAge()方法。
setMaxAge(正数)
,表示在指定的秒数后过期setMaxAge(负数)
,表示浏览器一关,Cookie 就会被删除(默认值是-1)setMaxAge(0)
,表示马上删除 Cookie
protected void defaultLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//浏览器一关,Cookie 就会被删除
Cookie cookie = new Cookie("defaultLife","defaultLife");
cookie.setMaxAge(-1);
response.addCookie(cookie);
}
6. Cookie 有效路径 Path 的设置
Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。 path 属性是通过请求的地址来进行有效的过滤。
CookieA——path=/工程路径
CookieB——path=/工程路径/abc
① 请求地址为:http://ip:port/工程路径/a.html
- CookieA 发送
- CookieB 不发送
② 请求地址为:http://ip:port/工程路径/abc/a.html
- CookieA 发送
- CookieB 发送
示例:
protected void testPath(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决乱码问题
response.setContentType("text/html; charset=UTF-8");
Cookie cookie = new Cookie("path1","path1");
//request.getContextPath()得到工程路径
cookie.setPath(request.getContextPath()+"/abc");
response.addCookie(cookie);
response.getWriter().println("创建了一个pathcookie");
}
- 当访问
http://localhost:8080/Example/a.html
来请求html页面的时候,cookie不会被传递。
- 当访问http://localhost:8080/Example/abc/a.html来请求html页面的时候,cookie会被传递。
7. Cookie 练习—免输入用户名登录
<body>
<form action="Example/loginservlet" method="get">
用户名:<input type="text" name="username" value="${cookie.username.value}"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="登陆">
</form>
</body>
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
if("xzy".equals(username) && "123456".equals(password)){
Cookie cookie =new Cookie("username",username);
cookie.setMaxAge(60*60*24*7);//cookie一周内有效
resp.addCookie(cookie);
resp.getWriter().println("登陆 成功");
}
else {
resp.getWriter().println("登陆 失败");
}
}
}
8. Token
token是用户身份的验证方式,我们通常叫它:令牌。
最简单的token组成:
- uid(用户唯一的身份标识)、
- time(当前时间的时间戳)、
- sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。
还可以把不变的参数也放进token,避免多次查库。
应用场景:
A:当用户首次登录成功(注册也是一种可以适用的场景)之后, 服务器端就会生成一个 token 值。这个token 值,会在服务器保存(保存在数据库中),之后再将这个token值返回给客户端.
B:客户端拿到 token 值之后,进行本地保存。(SP存储是大家能够比较支持和易于理解操作的存储)
C:当客户端再次发送网络请求的时候(一般不是登录请求),就会将这个 token 值附带到参数中发送给服务器.
D:服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值做对比
对比一:如果两个 token 值相同, 说明用户登录成功过!当前用户处于登录状态!
对比二:如果没有这个 token 值, 则说明没有登录成功.
对比三:如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录.