一、业务需求
会话:web应用中的会话是指一个客户端浏览器和服务器之间连续发生的一系列请求和响应的过程。
会话状态:web应用中的会话状态是指web服务器与浏览器在会话过程中产生的状态信息,借助会话状态,服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。
Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种状态保持机制。
Web应用开发中,存储和管理用户状态是至关重要的。为了实现这一目标,开发者通常依赖于两种主要机制:Cookie和Session。尽管它们都是为了维护用户状态而设计的,但它们在实现方式、安全性、存储位置和容量等方面存在一些显著的区别。
Cookie存储在浏览器中,可以设置过期时间,而Session存储在服务器端,关闭浏览器后自动失效。Session相对于Cookie更安全,但仍然存在安全风险。Session可以存储任意类型的数据,而Cookie有大小限制。选择Session或Cookie应考虑应用场景和安全性要求。
这次先聊一下Cookie。
二、Cookie是什么?
Cookie实际上是一小段的文本信息。
客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
三、Cookie实现原理
web服务器通过在http响应消息头总增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在http请求消息中增加Cookie请求头字段将Cookie回传给web服务器。
当用户首次访问某个网站时,服务器会向用户的浏览器发送一段包含用户信息的数据(即Cookie)。浏览器接收并存储这些数据,以便在用户下次访问该网站时将其发送回服务器。这样,服务器就可以根据这些信息识别用户并提供相应的服务。需要注意的是,Cookie可以设置过期时间。如果设置了过期时间,那么即使关闭了浏览器,Cookie仍然会保存在本地硬盘中,直到过期时间到达才会被删除;如果没有设置过期时间,那么关闭浏览器时Cookie就会被删除。
四、Cookie与浏览器相关
Cookie功能需要浏览器的支持。如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。不同的浏览器采用不同的方式保存Cookie。
IE浏览器会在“C:\Documents and Settings\你的用户名\Cookies”文件夹下以文本文件形式保存,一个文本文件保存一个Cookie。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
五、实战演练
免输入用户名登录(记住用户名)。
1、实现设计
2、登录页面
在我们的项目中添加一个login.jsp页面
添加如下代码:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="http://localhost:8080/HelloJSP/LoginServlet" method="get">
username:<input type="text" name="username" value="${cookie.username.value}"> <br>
password:<input type="password" name="password"> <br>
<input type="submit" value="Login">
</form>
</body>
</html>
3、Servlet 程序
添加一个servlet到项目中
修改doGet代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("zhangsan".equals(username) && "123456".equals(password)) {
//登录成功
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(60 * 60 * 24 * 7);//当前Cookie 一周内有效
response.addCookie(cookie);
System.out.println("登录成功");
} else {
// 登录失败
System.out.println("登录失败");
}
}
4、测试是否记住用户名
第一次输入用户名:zhangsan,密码123456,登录成功。
再次在浏览器输入http://localhost:8080/HelloJSP/login.jsp
观察页面中的用户名已经被记住了。
参考资料:
https://blog.csdn.net/J080624/article/details/78560716
https://blog.csdn.net/weixin_45829957/article/details/109277706
https://baijiahao.baidu.com/s?id=1792235103352395317&wfr=spider&for=pc
https://baijiahao.baidu.com/s?id=1786997538208967885&wfr=spider&for=pc