会话控制 Cookie Session

本文详细介绍了Cookie和Session的概念、工作原理、使用方法及其优缺点。Cookie是服务器保存在浏览器上的信息,用于识别用户状态,而Session则在服务器端存储用户数据,通过JSESSIONID的Cookie保持会话。内容包括Cookie的创建、设置、有效期、路径设置,以及Session的创建、获取、数据存取、有效期和释放。同时,文章提到了URL重写作为Cookie的备用方案,以及处理表单重复提交的问题。最后,深入探讨了Session的工作原理,帮助读者理解会话控制的本质。

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

第1章 Cookie的介绍

1.1 为什么需要Cookie

HTTP是无状态协议,**服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由一个客户端发出。**这样的设计严重阻碍了Web程序的设计。如:在我们进行网购时,买了一条裤子,又买了一个手机。由于HTTP协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么。而Cookie就是解决方案之一。

1.2 Cookie是什么

  • Cookie,翻译是小饼的意思。实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。

  • 例如:我们上文说的网上商城,当用户向购物车中添加一个商品时,服务器会将这个条信息封装成一个Cookie发送给浏览器,浏览器收到Cookie,会将它保存在内存中(注意这里的内存是本机内存,而不是服务器内存),那之后每次向服务器发送请求,浏览器都会携带该Cookie,而服务器就可以通过读取Cookie来判断用户到底买了哪些商品。当用户进行结账操作时,服务器就可以根据Cookie的信息来做结算。

  • Cookie的用途:

  • 网上商城的购物车

  • 保持用户登录状态

- 总结一句话:Cookie,是一种服务器告诉浏览器以键值对形式存储小量信息的技术。

1.3 Cookie的工作原理

  • 总的来看Cookie像是服务器发给浏览器的一张“会员卡”,浏览器每次向服务器发送请求时都会带着这张“会员卡”,当服务器看到这张“会员卡”时就可以识别浏览器的身份。

  • 实际上这个所谓的“会员卡”就是服务器发送的一个响应头:

在这里插入图片描述

如图Set-Cookie这个响应头就是服务器在向浏览器发“会员卡”,这个响应头的名字是Set-Cookie,后边JSESSIONID=95A92EC1D7CCB4ADFC24584CB316382E和 Path=/Test_cookie,是两组键值对的结构就是服务器为这个“会员卡”设置的信息。浏览器收到该信息后就会将它保存到内存或硬盘中。

当浏览器再次向服务器发送请求时就会携带这个Cookie信息:

在这里插入图片描述

  • 这是浏览器发送的请求报文,中间画红框的就是Cookie信息,这里可以理解为浏览器这次带着“会员卡”再次访问服务器。

  • 于是服务器就可以根据Cookie信息来判断浏览器的状态。

  • Cookie的缺点

    • Cookie因为请求或响应报文发送,无形中增加了网络流量。

    • Cookie是明文传送的安全性差。

    • 各个浏览器对Cookie有限制,使用上有局限。

第2章 Cookie的使用

2.1 Cookie的创建与设置

  1. 在Servlet中创建Cookie对象,并添加到Response中。
  2. 然后打开浏览器访问Servlet程序,服务器将Cookie信息发送给浏览器。
  3. 浏览器收到Cookie后会自动保存,然后我们可以在下次浏览器发送请求时读取Cookie信息。

说明:按下F12查看Cookie内容

图解Cookie的创建过程:

在这里插入图片描述Cookie的创建代码:

/**
 * Cookie的代码
 */
public class CookieServlet extends BaseServlet {
   
   
	private static final long serialVersionUID = 1L;

	protected void createCookie(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
   
   
		
		// Cookie的创建
		Cookie cookie = new Cookie("cookie-name", "cookie-Value");
		Cookie cookie2 = new Cookie("cookie-name2", "cookie-Value2");

		// 告诉浏览器保存
		response.addCookie(cookie);
		response.addCookie(cookie2);
		response.getWriter().write("已创建Cookie……");
	}
}

web.xml文件中的配置

<servlet>
	<servlet-name>CookieServlet</servlet-name>
	<servlet-class>com.atguigu.servlet.CookieServlet</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>CookieServlet</servlet-name>
	<url-pattern>/cookieServlet</url-pattern>
</servlet-mapping>

修改html页面中连接的访问地址为:

<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>

然后点击访问。记住,访问的时候,一定不是把html的页面托到浏览器中访问,而是在浏览器里输出地址,通过访问Tomcat服务器访问页面。

浏览器工具–查看结果:

谷歌浏览器,直接按下F12功能键,会弹出调试工具,选择Resource-----Cookies----localhost查看localhost域名下的cookie。

在这里插入图片描述

2.2 Cookie的读取

读取Cookie主要指读取浏览器中携带的Cookie。

  1. 服务器端获取浏览器传过来的Cookie代码:request.getCookies()
  2. 遍历Cookie数组,获取所有Cookie信息
  3. 修改html连接,点击访问
  4. 打开浏览器工具查看HTTP协议内容
  5. 查看服务器代码获取Cookie后的输出

图解Cookie的获取过程

在这里插入图片描述
获取Cookie的代码:

protected void getCookie(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
   
   
		// 获取所有cookie对象
		Cookie[] cookies = request.getCookies();
		// 如果没有cookie,则返回null。
		if (cookies != null) {
   
   
			// 有cookie则遍历
			for (Cookie cookie : cookies) {
   
   
				response.getWriter().write("Cookie名:" + cookie.getName() 
						+ "<br/>Cookie值:" + cookie.getValue() + "<br/><br/>");
			}
		} else {
   
   
			response.getWriter().write("没有Cookie");
		}
		
	}

修改html页面中的连接访问地址为:

<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月常新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值