Servlet中Cookie的使用

本文详述了Cookie在Java Servlet中的应用,包括概念解释、常用API介绍、Cookie清除与路径设置,以及一个实现记住用户名功能的实战案例。通过示例代码,展示了如何创建、读取、清除Cookie,强调了在设置setMaxAge()和setPath()时的注意事项,以确保正确管理Cookie。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本篇主要记录了Cookie的常用api以及对应的一个小案例。


一、Cookie和Session的概念

1. 会话管理

首先我们先来了解下会话:用户打开一个浏览器,点击多个链接,访问服务器多个web资源,然后关闭浏览器,整个过程称为一个会话。

2. 保存会话的两种技术之一:cookie

Cookie:客户端 的技术,程序把用户的数据以cookie的形式写给各自的浏览器。当用户再次访问服务器的web资源时,就会带着各自的数据去。

二、Cookie的使用

1. 一些简单常用的API

获取cookie数组:Cookie[] cookies = request.getCookies();
创建cookie:Cookie cookie = new Cookie(key, value);
把cookie写入客户端:response.addCookie(cookie);

2. Cookie的清除以及设置路径注意事项

在cookie的api中还有两个个常用的api

setMaxAge(),这里我们具体来看下它的使用:

  • setMaxAge()是设置cookie有效时间,持久化到磁盘上的时间;
  • 设置为0的时候,就相当于删除;
  • 设置为整数,就是保存在磁盘上的时间,且参数是以秒为单位的;
  • 如果设置为负数,那就是保存在浏览器缓存的时间,关闭浏览器,那么就没有了。

setPath() 是要这里提到的第二个常用的API。

  • 它的作用是:在当前项目路径下的资源都可以访问到cookie。
    (接下来,展示下设置为0,删除的功能以及设置路径的注意事项。)

首先,现创建一个servlet,在第一次访问的时候,我们把当前时间戳保存下来,当做cookie;之后访问的时候,展示这个cookie

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	resp.setContentType("text/html;charset=UTF-8");
	PrintWriter writer = resp.getWriter();
	Cookie[] cookies = req.getCookies();
	for (int i = 0; cookies!=null&&i <cookies.length ; i++) {
		if("lastAccessTime".equalsIgnoreCase(cookies[i].getName())){
			long l = Long.parseLong(cookies[i].getValue());
			writer.write("最后的访问时间为:"+new Date(l).toString());
			writer.println("<a href='"+req.getContextPath()+"/cookie/clear'>clear</a>");
		}
	}
	Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
	cookie.setMaxAge(60*5);
	cookie.setPath("/");    //注意这里我们给cookie设置了路径,则在当前项目下的servlet都可以访问到这个cookie
	resp.addCookie(cookie);
}

我们再写一个删除cookie的servlet,这里用到的就是把setMaxAge()中传入0:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        for (int i = 0; cookies!=null&&i <cookies.length ; i++) {
            if("lastAccessTime".equalsIgnoreCase(cookies[i].getName())){
                cookies[i].setMaxAge(0);
                cookies[i].setPath("/");          //要设置和上面的servlet一样的路径,要不然过期的这个cookie和那个就不是同一个
                resp.addCookie(cookies[i]);
            }
        }
    }

最后的页面展示如图:
在这里插入图片描述
(这里需要注意的一点是,第一次访问的时候是没有这个访问时间,和清除链接的,因为第一次访问我们没有cookie,所以不会走for循环,而是直接走下面的设置cookie的代码)

当我们点击clear之后,再访问demo1这个链接的时候,就是一片空白了,因为cookie被清除了,如同我们第一次访问一样。

刚刚我们讲解的是setMaxAge()的功能,仔细看的话,会注意到一个细节,就是我在两个servlet下都设置了同样的path,如图:
在这里插入图片描述
这里我们先来看下如果,我们只给demo1的servlet设置setPath("/"),不给clear的设置,会出现什么样的效果:
在这里插入图片描述
在浏览器的cookie中我们看到了两个同名的cookie,一个是demo1中的,一个是clear中的,而我们在clear的代码中设置了删除,确实这里是过期了,但是另一个依然存在,并且没有过期。
所以,当我们去使用setMaxAge()删除一个cookie的时候,一定要保证这个cookie的路径和我们创建的那个cookie是用一个路径的,最稳妥的办法就是给他设置成同一个。因为使用默认的路径,有概率出现不是同一个的情况。
下面这张图,就是设置了同一个路径(也就是我们一开始代码所写的)查看的cookie情况:
在这里插入图片描述

3. Cookie的小案例:记住用户名

我们先看一下,页面的样子:
在这里插入图片描述
这个案例的要求如下:当我输入正确的用户名和密码并勾选记住用户名登录,第二次我再次访问这个登录的页面时,会默认记住我的用户名和勾选的状态。
下面我们来看下代码的实现:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	resp.setContentType("text/html;charset=UTF-8");
	PrintWriter writer = resp.getWriter();
	String userName="";
	String checked = "";
	Cookie[] cookies = req.getCookies();
	for (int i = 0; cookies!=null&&i < cookies.length; i++) {
		if("userName".equalsIgnoreCase(cookies[i].getName())){
			userName=cookies[i].getValue();
			checked="checked='checked'";
			//这里从cookie中拿到userName,然后再写回页面中同时设置复选框为勾选状态;
			//如果没有cookie,那么就不会走这里的代码,也就不会展示
		}
	}
	writer.write("<form action='/java_web_day01/cookie/demo3' method='post'>");
	writer.write("用户名:<input type='text' name='userName' value='"+userName+"'><br/>");
	writer.write("密码:<input type='password' name=pwd><br/>");
	writer.write("记住用户名:<input type='checkbox' name=remember "+checked+"><br/>");
	writer.write("<input type='submit' value='登录'>");
	writer.write("</form>");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	this.doGet(req,resp);             
	//因为是个小练习,所以前端展示的代码也写在这里了;
	//但是会出现一个问题,展示的页面用的是get请求去获取,但是表单要用post去提交,所以我们在post请求的方法里面调用get方法的代码,这样就不会出现问题了
}

下面是处理登录逻辑的代码,我们要去做以下几件事:

  • 判断用户是否登录成功 — 拿到用户名和密码,然后去比对
  • 登录成功的话,判断是否勾选了记住用户名,如果勾选了,就要保存用户名到cookie中;没有勾选,那么我们就把cookie删除,以防使用前一次记录下的cookie
  • 登录不成功,我们让它跳转回登录页面
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	req.setCharacterEncoding("UTF-8");
	resp.setContentType("text/html;charset=UTF-8");
	PrintWriter writer = resp.getWriter();
	String userName = req.getParameter("userName");
	String pwd = req.getParameter("pwd");
	String remember = req.getParameter("remember");
	Cookie cookie = new Cookie("userName",userName);
	cookie.setPath("/");
	if("tom".equalsIgnoreCase(userName)&&"123456".equalsIgnoreCase(pwd)){
		if(remember!=null){
			cookie.setMaxAge(Integer.MAX_VALUE);
		}else {
			cookie.setMaxAge(0);
		}
		resp.addCookie(cookie);
		writer.print("登录成功");
	}else{
		writer.print("登录失败");
		resp.addHeader("refresh", "3;url=/java_web_day01/cookie/demo2");
	}
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}

我们查看一下浏览器中保存的cookie:
在这里插入图片描述


总结

本文主要介绍了cookie的一些用法以及记住用户名的小案例。下次我们将介绍另一种保存会话的技术:session。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值