Servlet复习笔记(6)——Cookie(详细)

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 值的修改

方案一:

  1. 创建一个要修改的同名(指的就是 key)的 Cookie 对象
  2. 在构造函数,同时赋于新的 Cookie 值
  3. 调用 response.addCookie(Cookie)

方案二:

  1. 查找到需要修改的 Cookie 对象
  2. 调用 setValue()方法赋于新的 Cookie 值
  3. 调用 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 值不同: 说明原来的登录信息已经失效,让用户重新登录.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值