Cookie
[!tip]
Cookie是一种在客户端存储数据的小型文本文件,由Web服务器发送到用户的浏览器,然后由浏览器保存。它们通常用于跟踪、识别和存储用户在网站上的各种信息,以实现个性化的用户体验或跟踪用户的行为。
- Cookie是服务器通知客户端保存键值对的一种技术。
- 客户端有了Cookie后,每次请求都发送给服务器
- 每个Cookie的大小不能超过4kb,不能保存中文,括号等特殊字符
Cookie的关键特点
-
持久性: 可以设置Cookie的过期时间,使其在浏览器关闭后仍然保留在用户的计算机上一段时间。
-
域名关联: Cookie与特定的域名相关联,只有与创建Cookie的域名匹配的HTTP请求才会发送该Cookie。
-
大小限制: 浏览器对于单个域名下的Cookie数量和总大小有限制。
-
安全性: Cookie可以设置为只在安全连接(HTTPS)中传输,以增强安全性。
-
客户端存储: 存储在Cookie中的信息保存在用户的计算机上,因此可以在客户端进行检索和修改。这也意味着Cookie中的信息可以被用户查看和操纵,因此不应存储敏感信息,如密码等。
Cookie常见的用途
-
会话管理: 用于跟踪用户的会话状态。例如,保持用户登录状态,以便在用户浏览多个页面时保持其登录状态。
-
个性化内容: 根据用户的偏好和行为提供个性化的内容。例如,保存用户的语言选择、主题偏好或购物车内容。
-
广告跟踪: 用于跟踪用户的浏览行为,以向其提供相关的广告。例如,根据用户的兴趣来定向广告。
-
安全认证: 在一些情况下,Cookie可以用于实现基于令牌的身份验证和安全授权机制,以提供更安全的用户体验。
尽管Cookie在Web开发中非常常见,但它们也存在一些限制和安全风险。例如,Cookie可能会被篡改、截获或滥用,因此开发人员应该注意在使用Cookie时采取适当的安全措施,如使用HTTPS、限制Cookie的访问范围等。
Cookie的创建
- 客户端(浏览器)一开始没有cookie
- 第一次发送请求,服务器创建cookie,并通知客户端保存cookie
- 客户端收到响应后,发现有set-cookie响应头,就去看一下有没有这个cookie,没有就创建,有就修改
- 客户端后面的请求都会带着cookie
- 服务端获取客户端发送过来的cookie
/**
* 创建Cookie
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
public void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建Cookie对象
Cookie cookie = new Cookie("key1", "zjm");
//2.通知客户端保存Cookie
resp.addCookie(cookie);
Cookie cookie1 = new Cookie("key2", "zjm2");
resp.addCookie(cookie1);
resp.getWriter().write("Cookie创建成功");
}
服务器获取Cookie
/**
* 获取浏览器Cookie
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
public void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
//getName()获取cookie的key
//getValue()获取cookie的value
resp.getWriter().write(cookie.getName() + "=" + cookie.getValue() + "<br/>");
}
//获取某个具体的Cookie
// Cookie cookie1 = null;
// for (Cookie cookie : cookies) {
// if ("key1".equals(cookie.getName())) {
// cookie1 = cookie;
// break;
// }
// }
//使用自己的工具类
Cookie cookie1 = CookieUtils.findCookie("key1", cookies);
if (cookie1 != null) {
resp.getWriter().write("找到要的cookie:" + cookie1.getName() + "=" + cookie1.getValue());
}
}
Cookie值的修改
[!note]
方案一:
- 创建一个要修改的同名的Cookie对象
- 在构造器,同时赋予新的Cookie值
- 调用response.addCookie(Cookie)
[!note]
方案二:
- 先查找需要修改的Cookie对象
- 调用setValue()方法赋予新的Cookie值
- 通知客户端保存修改
Cookie的存活设置
setMaxAge(int maxAge)
方法
maxAge | 含义 |
---|---|
正整数 | Cookie 将在指定的秒数后过期。 |
0 | Cookie 将被立即删除。 |
负整数 | Cookie 将被设置为会话 Cookie,在用户关闭浏览器时过期。 |
Cookie有效路径Path的设置
Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发
path属性是通过请求地址来过滤的
cookie.setPath(req.getContextPath()+"/abc");
整理
方法 | 描述 |
---|---|
setMaxAge(int age) | 设置 Cookie 的最大存活时间(以秒为单位)。 - 正整数:在指定秒数后过期。 - 0:立即删除 Cookie。 - 负整数:设置为会话 Cookie,关闭浏览器时过期。 |
setPath(String uri) | 设置 Cookie 的路径。 - 默认为当前页面的路径。 - 只有与该路径匹配的页面才能访问该 Cookie。 |
setDomain(String pattern) | 设置 Cookie 的域。 - 默认为创建 Cookie 的页面的域。 - 只有与该域匹配的页面才能访问该 Cookie。 |
setSecure(boolean secure) | 设置 Cookie 的安全标志。 - 如果设置为 true,则只有通过 HTTPS 连接的页面才能访问该 Cookie。 |
setHttpOnly(boolean httpOnly) | 设置 Cookie 是否仅通过 HTTP 协议传输。 - 如果设置为 true,则无法通过客户端脚本访问该 Cookie。 |
免用户名登录
- 客户端/浏览器输入用户名和密码,第一次发送请求
- 服务器接收到用户名和密码判断对错,如果正确就把用户名保存到cookie中发送给客户端
- 客户端后面的请求都带着用户名
Cookie编码与解码
[!tip]
Cookie 编码与解码在 Web 开发中是非常重要的,其主要原因有以下几点:
特殊字符处理: Cookie 中可能包含特殊字符,例如空格、等号、分号等,这些字符在 HTTP 请求中具有特殊含义。编码 Cookie 可以确保其中的特殊字符不会干扰解析过程。
安全性考虑: 如果用户提供了可能被视为恶意的数据,如 HTML 标签或 JavaScript 代码,将这些数据直接写入 Cookie 可能会导致跨站点脚本攻击(XSS)。编码 Cookie 可以帮助防止这种情况的发生。
兼容性: 不同的浏览器和服务器对于 Cookie 中的特殊字符的处理方式可能不同。编码 Cookie 可以提高跨浏览器和跨平台的兼容性。
数据完整性: 如果 Cookie 中包含了某些特殊字符,这些字符可能会被错误地解析或截断,导致数据的不完整性。编码 Cookie 可以确保数据在传输过程中的完整性。
避免歧义: 对于一些可能具有歧义的字符,如空格或者 Unicode 字符,编码 Cookie 可以帮助消除歧义,确保数据能够被正确地解析。
使用java.net.URLEncoder
和java.net.URLDecoder
类来进行Cookie的编码和解码。
- 编码
URLEncoder.encode("姓名", "UTF-8")
- 解码
URLEncoder.encode("姓名", "UTF-8")
Session
session简介
- Session就是一个接口(HttpSession)。
- Session就是会话,他是用来维护一个客户端和服务器之间关联的一种技术。
- 每个客户端都有自己的一个Session会话。
- Session会话中,我们经常用来保存用户登录之后的信息。
[!tip]
在JavaWeb中,Session是一种用于在客户端和服务器之间跟踪用户状态的机制。它允许服务器在用户访问网站时存储和检索信息,以便在用户多次请求之间保持状态。
Session通常用于以下几个方面:
用户身份验证和授权:当用户成功登录时,服务器可以创建一个Session来存储用户的身份信息,以便在后续的请求中验证用户的身份和权限。
跟踪用户状态:Session可以用于跟踪用户在网站上的活动和状态。例如,可以在Session中存储用户的购物车内容、偏好设置等信息。
实现购物车功能:通过Session,可以在用户浏览网站时跟踪他们选择的商品,并在结账时保存购物车的内容。
实现单点登录(SSO):在多个相关联的应用程序之间共享用户登录状态,以便用户只需登录一次,然后可以访问所有应用程序而无需再次登录。
在JavaWeb中,Session通常是通过HttpServletRequest对象来管理的。当用户第一次访问服务器时,服务器会为该用户创建一个唯一的Session,并将一个Session ID(通常是一个长随机字符串)发送给客户端,客户端会在后续的请求中将该Session ID发送回服务器。服务器使用这个Session ID来识别用户,并根据需要检索和更新与该Session相关的信息。
Session在JavaWeb中通常使用以下几种方式实现:
基于Cookie的Session管理:Session ID通常存储在客户端的Cookie中,并在每个请求中发送回服务器。这种方式简单易用,但受到Cookie的限制和安全性的考虑。
URL重写:在URL中包含Session ID,而不是使用Cookie。这种方式通常用于在不支持Cookie的环境中(如移动设备)实现Session管理。
隐藏表单字段:在HTML表单中包含一个隐藏字段来存储Session ID,以便在表单提交时发送回服务器。
Session的生命周期可以由开发人员进行配置,可以在Web.xml文件中配置Session的超时时间和其他属性,以满足具体的需求。
创建Session和获取Session
-
req.getSession()
-
isNew():判断是否是新创建的Session
-
getId()得到SessionID
Session保存数据和获取数据
/**
* session中保存数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.setAttribute("key1","zjmshdjgahj"); //保存数据
resp.getWriter().write("保存成功");
}
/**
* session中获取数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Object key1 = session.getAttribute("key1"); //获取数据
resp.getWriter().write("session中获取到的值:"+key1);
}
Session生命周期控制
[!tip]
Session默认超时时间是30分钟(1800秒)
Session超时时间修改所有
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<session-config>
<session-timeout>20</session-timeout>
</session-config>
</web-app>
方法 | 描述 |
---|---|
getMaxInactiveInterval() | 返回Session的最大非活动间隔时间(以秒为单位)。该值表示在没有活动时,Session保持有效的最长时间。 |
setMaxInactiveInterval(int) | 设置Session的最大非活动间隔时间(以秒为单位)。如果在指定的间隔时间内没有活动,Session将失效。 正数表示超时时长 ,负数表示永不超时 |
invalidate() | 使Session失效。调用此方法将立即将Session标记为无效,并清除与之相关的所有数据。 |
[!important]
Session超时指,客户端两次请求的最大间隔时长。
Session超时时间是指在用户最后一次请求之后,服务器将等待的时间长度,如果在这段时间内用户没有再次请求,那么服务器将会使Session失效,即清除Session数据,释放相关资源
浏览器和Session之间关联
-
Cookie:
- Cookie是最常用的维持会话状态的机制之一。当服务器创建一个Session时,它会生成一个唯一的Session ID,并将该Session ID存储在一个名为Cookie的小型文本文件中。
- 浏览器在收到服务器响应时会将Cookie保存在本地。每当浏览器向服务器发送请求时,它会自动将与该网站相关联的Cookie一起发送给服务器,其中包含了Session ID。
- 这样,服务器就可以根据Session ID识别用户,并将用户的请求与正确的Session关联起来,从而实现会话跟踪。
-
URL重写:
- 在某些情况下,如果浏览器不支持Cookie或者Cookie被禁用,可以使用URL重写技术来传递Session ID。
- 服务器会将Session ID附加到每个URL中,以便在用户点击链接或者提交表单时将Session ID传递给服务器。
- 这样服务器就能够根据URL中的Session ID来识别用户,从而维持会话状态。
-
隐藏表单字段:
- 在HTML表单中可以添加一个隐藏字段,用于存储Session ID。当用户提交表单时,该隐藏字段会一同发送给服务器。
- 服务器接收到请求后,就能够从隐藏字段中提取Session ID,并识别用户的会话状态。
这些技术在不同情况下都可以用来建立浏览器和Session之间的关联,以实现会话跟踪和状态维护。选择哪种技术取决于应用的特定需求以及对于安全性和性能的考虑。通常情况下,Cookie是最常见、最方便的方法,但在某些情况下,URL重写和隐藏表单字段可能会更为适用。
[!caution]
Session技术,底层是基于Cookie技术来实现的
Session用途
-
用户认证和授权:Session可用于跟踪用户的登录状态和权限,以验证用户的身份并控制其访问权限。一旦用户登录成功,服务器可以创建一个Session,并在Session中存储用户的身份信息和权限信息,以便在用户进行其他操作时进行验证。
-
跟踪用户状态和活动:通过Session,服务器可以跟踪用户在网站上的活动和状态。例如,可以在Session中存储用户的浏览历史、购物车内容、偏好设置等信息,从而提供个性化的服务和体验。
-
购物车功能:Session常用于实现网上购物车功能。当用户在网站上选择商品时,服务器会将商品信息存储在用户的Session中,直到用户完成购买或离开网站时才清除Session中的数据。
-
缓存数据:Session可以用作临时的数据缓存区域,存储一些需要在用户会话期间共享和访问的数据。这些数据可以是来自数据库、外部API或其他来源的结果,以提高数据访问速度和性能。
-
单点登录(SSO):Session可用于实现单点登录功能,允许用户在多个相关联的应用程序之间共享登录状态,从而避免用户重复登录。一旦用户登录成功并创建了一个Session,其他应用程序可以共享同一Session来验证用户身份。
-
防止重复提交:Session可以用于防止用户重复提交表单或操作。例如,在用户提交表单时,服务器可以将表单数据存储在Session中,并在处理完表单提交后将Session中的数据清除,从而防止用户进行重复提交。