javaWEB总结(17):cookie概述

本文介绍了HTTP协议的无状态特性及其带来的挑战,并详细探讨了如何通过Cookie机制实现有状态的会话跟踪,包括Cookie的工作原理及其在实际项目中的应用。

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

HTTP协议

HTTP是一种无状态协议,WEB服务器本身不能识别出哪些请求时同一个游览器发出的,游览器的每次请求都是完全孤立的。所以作为WEB服务器,必需采用一种机制来唯一标识一个用户,同时记录该用户的状态。


会话和会话状态


WEB应用中的会话是指一个客户端游览器与WEB服务器之间连续发生的一系列请求和响应过程。WEB应用的会话状态是指WEB服务器与游览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一个会话的一系列请求和响应关联起来。


如何实现有状态的会话

WEB服务器端要能从大量的请求消息中区分出那些请求属于同一个会话,即能区分出来自同一个浏览器的访问请求。这需要浏览器对其发出的每个请求消息都进行标识,属于同一个会话中的请求消息都附带同样的标识符号,而属于不同会话的请求消息总是带不同的标识符号,这个符号就称之为会话ID(SessionID);

在Servlet规范中,常用以下两种机制完成会话跟踪:

1.Cookie

2.Session


Cookie机制

Cookie机制采用的是在客户端保持HTTP状态信息的方案。

Cookie是浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP相应消息头中附带传送给浏览器的一个小文本文件。一旦浏览器保存了某个Cookie,那么它以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。


Cookie的传送过程示意图





如图所示,第一次访问无cookie,第一次响应时服务器给游览器传递了cookie并写入了Cookie存储区。第二次及以后每次请求都会带上这个cookie。



下面是一个demo



目录结构




web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>javaWeb_17</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>

index.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>

	<%
		//1.创建一个Cookie
		Cookie cookie= new Cookie("name","daochuwenziyao");
	
		//2.调用response的addCookie方法,把Cookie传给客户端
		response.addCookie(cookie);
	
	
	
	%>


</body>
</html>

第一次访问



请求中无cookie信息,而相应头中有set-cookie:name=daochuwenziyao ,说明服务器传递给游览cookie.




第二次访问后


请求头中已带有cookie的信息。说明从cookie请求区中拿到了上次的cookie信息。





为了更加直观,我们改变index.jsp文件

(请在IE游览器下执行,其他游览器有运行不成功的状况发生)



index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>

	<%
		
		Cookie[] cookies =request.getCookies();
		
		//有cookie循环打印出来
		if(cookies!=null&&cookies.length>0){

			for(Cookie cookie:cookies){
				
				out.print(cookie.getName()+":"+cookie.getValue());
				out.print("<br>");
			}
		}
		//无cookie
		else{
			
			out.print("没有一个cookie,正在创建cookie^");
			
			//1.创建一个Cookie
			Cookie cookie= new Cookie("name","daochuwenziyao");
		
			//2.调用response的addCookie方法,把Cookie传给客户端
			response.addCookie(cookie);
		}
		
	
	
	
	%>


</body>
</html>

第一次运行




第二次运行






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值