Cookie和Session笔记

本文介绍了Cookie和Session的基本概念、用途及操作方法。Cookie是服务器发送到客户端并存储的小数据,用于实现HTTP请求的有状态,常见操作包括设置、读取和删除。Session是基于Cookie的会话管理机制,数据存储在服务器端,通过JSESSIONID标识。文章还讨论了Cookie的安全问题和Session的生命周期管理。
摘要由CSDN通过智能技术生成

Cookie

cookie是服务器生成给客户端的,并且存储在客户端的小数据

  • 为什么要有这个cookie的存在?

http的请求是无状态的,即,客户端在第二次来访服务器时,服务器根本不知道客户端来过。(自动登录、大数据分析需要)

  • 添加cookie给客户端&获取客户端发来的cookie
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//第一次访问服务器发送cookie给客户端
		Cookie cookie = new Cookie("cookie1", "hello");
		//给响应添加一个cookie
		resp.addCookie(cookie);
		resp.setContentType("text/html; charset=UTF-8"); 
		resp.getWriter().write("请求成功");
		
		//第二次来访,获取客户端带过来的cookie
		Cookie[] cookies = req.getCookies();
		if(null != cookies) {
			for (Cookie c : cookies) {
				System.out.println(c.getName());
				System.out.println(c.getValue());
			}
		}
	}

在浏览器中查看cookie:
在这里插入图片描述

  • 常用方法
    关闭浏览器后,cookie就没有了。 —> 针对没有设置cookie的有效期。
    // expiry: 有效 以秒计算。
    //正值 : 表示 在这个数字过后,cookie将会失效。
    //负值: 关闭浏览器,那么cookie就失效, 默认值是 -1

      cookie.setMaxAge(60 * 60 * 24 * 7);//一周
      
      //赋值新的值
      //cookie.setValue(newValue);
      
      //用于指定只有请求了指定的域名,才会带上该cookie
      cookie.setDomain(".itheima.com");
      
      //只有访问该域名下的cookieDemo的这个路径地址才会带cookie
      cookie.setPath("/CookieDemo");
    
  • 显示最近访问时间

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		resp.setContentType("text/html; charset=UTF-8");
		if("bela".equals(username) && "abc123".equals(password)) {
			Cookie[] cookies = req.getCookies();
			Cookie cookie = CookieUtil.findCookie(cookies, "last");
			if(null == cookie) {//第一次访问
				Cookie c = new Cookie("last", System.currentTimeMillis() + "");
				c.setMaxAge(60 * 60);//设置一个小时候过期
				resp.addCookie(c);
				resp.getWriter().write("欢迎" + username + "登录");
			}else {
				long lastTime = Long.parseLong(cookie.getValue());
				resp.getWriter().write("欢迎" + username + ",上次登录时间" + new Date(lastTime));
				cookie.setValue(System.currentTimeMillis() + "");
				resp.addCookie(cookie);
			}
		}
	}

CookieUtil:

public class CookieUtil {
	public static Cookie findCookie(Cookie[] cookie, String name) {
		if(null != cookie) {
			for (Cookie c : cookie) {
				if(name.equals(c.getName())) {
					return c;
				}
			}
		}
		return null;
	}
}

顺一下思路,一开始服务器获取到了用户名密码信息,并设置好编码形式,请求获取客户端的所有cookie,寻找是否有一个叫last的cookie数据,若没有则该客户端是第一次访问,服务器需要生成这样一个cookie数据给客户端,让它下次再访问时,服务器可以识别;当发现该cookie存在时,代表二次访问,这个时候服务器只需要重新更新last的cookie的value再返回给客户端就可以。

  • 清除浏览记录

即清除Cookie, 删除cookie是没有delete方法的,只有设置maxAge 为0
Cookie分类

  • 分类
  1. 会话Cookie
    默认情况下,关闭了浏览器cookie就会消失。

  2. 持久Cookie
    在一定时间内,都有效,并且会保存在客户端上。

     cookie.setMaxAge(0); //设置立即删除
    
     cookie.setMaxAge(100); //100 秒
    
  • cookie的安全问题
    cookie保存在客户端上,存在安全隐患,并且有大小个数限制,故引出了session。

Session

Session是基于Cookie的一种会话机制。Cookie是服务器返回给客户端的一小份数据,保存在客户端;Session是数据存放在服务器端。
Session会在cookie里面添加一个字段 JSESSIONID,是tomcat服务器生成。

  • 常用API
@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//session的创建
		HttpSession session = req.getSession();
		//得到回话ID
		String id = session.getId();
		//存值
		session.setAttribute("hello", "world");
		//取值
		Object value = session.getAttribute("hello");
		System.out.println(value);//world
		//删除session值
		session.removeAttribute("hello");
		System.out.println(session.getAttribute("hello"));//null
	}
  • 何时创建销毁
    Servlet中调用 req.getSession();时创建
    Session是保存在服务器的数据,即使关闭浏览器也不会销毁,销毁真正方法两个:
    1. 关闭服务器。
    2. session回话时间过期,一般默认30分钟销毁,服务器规定的。
      在这里插入图片描述
  • 模拟购物车
    product_list.jsp:商品列表
<body>
	<a href="CartServlet?id=0"><h3>华为</h3></a><br>
	<a href="CartServlet?id=1"><h3>vivo</h3></a><br>
	<a href="CartServlet?id=2"><h3>oppo</h3></a><br>
	<a href="CartServlet?id=3"><h3>小米</h3></a><br>
	<a href="CartServlet?id=4"><h3>苹果</h3></a><br>
</body>

CartServlet.Servlet:添加进购物车

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		String[] names = {"华为", "vivo", "oppo", "小米", "苹果"};
		int id = Integer.parseInt(request.getParameter("id"));
		HttpSession session = request.getSession();
		String name = names[id];
		
		//获取购物车存放的货品信息
		Map<String, Integer> map = (Map<String, Integer>) session.getAttribute("cart");
		if(null == map) {
			map = new LinkedHashMap<String, Integer>();
			session.setAttribute("cart", map);
		}
		if(map.containsKey(name)) {
			map.put(name, map.get(name) + 1);
		}else {
			map.put(name, 1);
		}
		response.getWriter().write("<a href='product_list.jsp'><h1>继续购物</h1></a>");
		response.getWriter().write("<a href='Cart.jsp'><h3>结算</h3></a>");
	}

Cart.jsp:显示当前购物车信息

<body>
	<h1>购物车商品如下</h1>
	<hr>
	<%
	Map<String, Integer> map = (Map<String, Integer>) session.getAttribute("cart");
	
	if(null != map) {
		for(String key : map.keySet()) {
			%>
			<h3><%=key %><%=map.get(key) %>个</h3>
			<%
		}
	}
	%>
	<a href="Clear">清空购物车</a>
</body>

ClearCart:清空购物车

@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
		session.invalidate();//强制删除,啥都没了
		//session.removeAttribute("cart");//移除某一项
		resp.sendRedirect("Cart.jsp");
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值