🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。
🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。
🎉欢迎 👍点赞✍评论⭐收藏
缓存知识专栏学习
缓存知识云集 | 访问地址 | 备注 |
---|---|---|
缓存知识点(1) | https://blog.csdn.net/m0_50308467/article/details/134999017 | 缓存专栏 |
文章目录
- 🏆 认识缓存机制
- 🔎一、认识缓存机制(1)
- 🍁 01. Cookie 机制?
- 🍁 02. 什么是Cookie ?
- 🍁 03. Session 机制?
- 🍁 04. 什么是 Session ?
- 🍁 05. Cookie 和 Session 有什么区别?
- 🍁 06. 为什么需要 Cookie 和 Session,他们有什么关联?
- 🍁 07. 禁用Cookie后,怎么办?
- 🍁 08. Session对象的常用方法?
- 🍁 09. 详细讲述一下你知道的四种会话跟踪技术?
- 🍁 10. Web 应用中的四大作用域?
- 🍁 11. 在 JSP 中如何设置 Cookie?
- 🍁 12. Cookie 的应用场景?
- 🍁 13. Session 的应用场景?
- 🍁 14. 请简述 Cookie, Session 和 Application 它们的区别?
- 🍁 15. 如何考虑分布式 Session 问题?
- 🍁 16. 如何解决跨域请求?Jsonp 跨域的原理是什么?
🏆 认识缓存机制
🔎一、认识缓存机制(1)
🍁 01. Cookie 机制?
当您在浏览器上访问一个网站时,网站会将一小段文本信息存储在您的计算机上,这个文本信息被称为Cookie。Cookie 是存储在用户计算机上的一种小型文本文件,它包含了关于用户与网站的信息。
Cookie 机制的工作原理如下:
-
浏览器发送请求:当您访问一个网站时,浏览器会自动向该网站发送请求。请求中包含了与该网站相关的所有 Cookie 信息。
-
服务器发送响应:服务器接收到浏览器发送的请求并解析其中的 Cookie 信息。
-
服务器处理请求:服务器根据 Cookie 中的信息进行相应的处理,比如获取用户登录状态、记住用户的偏好设置等。
-
服务器发送响应:服务器会生成一个相应的 HTTP 响应,并将新的 Cookie 数据发送回浏览器。
-
浏览器存储 Cookie:浏览器接收到服务器发送的响应后,会将其中的 Cookie 数据保存起来。每次浏览器向该网站发送请求时,都会自动附带上相应的 Cookie 数据。
通过这种方式,网站可以通过 Cookie 来跟踪用户的行为、记录用户的登录状态,甚至进行广告定向投放等。
每个 Cookie 包含以下几个重要的字段:
- 名称:Cookie 的名称,用于标识唯一的 Cookie。
- 值:存储在 Cookie 中的数据。
- 域名:指定了该 Cookie 可以被发送到哪些域名下的网站。
- 路径:指定了该 Cookie 可以被发送到哪些路径下的网页。
- 过期时间:指定了 Cookie 的有效期限,如果没有设置则默认为会话结束后过期。
需要注意的是,Cookie 是以明文的形式存储在用户计算机上的,因此 Cookie 中不应存储敏感信息,如密码等。此外,浏览器也提供了一些设置选项,允许用户控制接受或拒绝 Cookie,以增强隐私保护。
🍁 02. 什么是Cookie ?
Cookie是在Web开发中用于存储和传递信息的一种机制。它是由服务器发送给浏览器的小型文本文件,保存在用户的计算机上。
具体来说,当用户在浏览器中访问一个网站时,网站会生成一个包含各种信息的Cookie,并将其发送到用户的计算机上。下次用户再次访问该网站时,浏览器会将之前存储的Cookie附加在请求中一同发送给服务器。
Cookie的主要作用是为了标识和跟踪用户。它可以记录用户的活动、存储用户的偏好设置、维持用户的登录状态等。通过Cookie,网站可以根据用户的特定需求和喜好来提供个性化的体验。
一个常见的应用场景是记住用户的登录状态。当用户成功登录后,服务器会生成一个Cookie,在用户下次访问时检查该Cookie,并根据其中的信息判断用户是否已登录,从而实现免登录功能。
Cookie还可以存储其他类型的信息,如购物车中的商品、广告跟踪数据等。它们可以有特定的过期时间,可以在用户访问其他页面时持续存在,也可以在会话结束后被删除。
需要注意的是,Cookie只能存储有限的数据量,大约在4KB左右。并且Cookie是明文传输的,因此不应该将敏感信息存储在Cookie中。为了确保用户的隐私安全,必须谨慎处理Cookie的使用。
最后,用户可以通过浏览器的设置来控制Cookie的行为,包括接受、拒绝、删除和限制Cookie的发送。这可以帮助用户保护个人隐私和控制跟踪行为。
🍁 03. Session 机制?
Session机制是一种在Web开发中用于跟踪用户状态和存储临时数据的机制。它通过在服务器端创建和管理会话来实现。
当用户在浏览器中访问一个网站时,网站会分配一个唯一的会话标识给该用户,并将该标识存储在Cookie中或通过URL重写进行传递。会话标识用于在服务器端唯一标识用户,并与用户的数据关联。
Session机制的工作流程如下:
-
会话的创建:当用户首次访问网站时,服务器会为该用户创建一个新的会话,并生成一个唯一的会话标识。
-
会话数据存储:在会话中,服务器会存储用户相关的数据,这些数据可以是用户的登录状态、用户的购物车信息、用户的偏好设置等。
-
会话标识传递:为了在多个页面间保持会话状态,服务器会将会话标识通过Cookie或URL重写的方式发送给用户的浏览器,浏览器会在后续的请求中将该标识带回服务器。
-
服务器端处理:当浏览器发送请求时,服务器会通过会话标识来判断该请求属于哪个会话,并从会话中获取相应的数据进行处理。
-
会话的销毁:会话可以有一个特定的生命周期,当用户退出登录、关闭浏览器或会话超时时,会话会被销毁,相关的数据也会被清除。
Session机制相比于Cookie机制,更安全,因为会话数据存储在服务器端,用户无法直接修改。同时,Session机制可以存储更多的数据,并且不受Cookie容量限制。
开发者可以根据需要在服务器端使用不同的会话存储方式,如内存、数据库或文件系统。同时,为了提高性能和可扩展性,可以使用缓存和分布式Session存储等技术来管理会话。
需要注意的是,Session机制需要服务器进行状态管理,增加了服务器的负担。同时,用户的会话标识需要通过Cookie或URL传递,需要保护好用户的隐私和会话安全。
🍁 04. 什么是 Session ?
Session是一个在Web开发中用于存储用户状态和临时数据的机制。它是一种服务器端的技术,可以追踪用户的活动并存储与用户相关联的信息。
具体来说,当用户在浏览器中访问一个网站时,服务器会为该用户创建一个唯一的会话,并生成一个会话标识。会话标识通常以Cookie的形式存储在用户的浏览器中,或者在URL中进行传递。
在会话中,服务器可以存储各种与用户相关的数据,如用户的登录状态、购物车内容、用户的偏好设置等。这些数据在会话期间可以被多个页面和请求所共享,以实现用户状态的跟踪和数据的临时存储。
Session的工作流程如下:
-
会话的创建:当用户首次访问网站时,服务器会为该用户创建一个新的会话,并生成一个唯一的会话标识。
-
会话数据存储:在会话中,服务器会存储需要保存的数据。这些数据可以是任何类型的信息,根据业务需求来决定。比如,存储用户的身份验证信息、用户的购物车内容、用户的访问历史等。
-
会话标识传递:为了在多个页面间保持会话状态,服务器会将会话标识通过Cookie或URL重写的方式发送给用户的浏览器。浏览器会在后续的请求中将该标识带回服务器,使得服务器可以识别出当前请求所属的会话。
-
服务器端处理:当浏览器发送请求时,服务器会根据会话标识来获取相应的会话数据,并进行处理。通过这种方式,服务器可以根据用户的会话状态来提供个性化的服务。
-
会话的销毁:会话可以有一个特定的生命周期,在用户退出登录、关闭浏览器或会话超时时,会话会被销毁,相关的数据也会被清除。
Session机制相对于Cookie机制更为安全,因为会话数据存储在服务器端,用户无法直接修改。同时,Session可以存储更多的数据,并且不受Cookie容量限制。
需要注意的是,为了保护用户的隐私和会话安全,开发者需要采取措施来防止会话劫持和会话固定攻击等安全问题。此外,Session机制需要服务器进行状态管理,增加了服务器的负担。开发者可以使用缓存和分布式Session存储等技术来提高性能和可扩展性。
综上所述,Session是一种用于存储用户状态和临时数据的服务器端机制,可以跟踪用户并提供个性化的服务。
🍁 05. Cookie 和 Session 有什么区别?
Cookie和Session是两种常用于Web开发中的机制,都用于存储和传递信息。虽然它们的实现目的非常相似,但是它们有以下几个方面的不同:
-
存储位置:Cookie存储在客户端(用户浏览器)中,而Session存储在服务器端。
-
存储容量:Cookie的存储容量较小,通常为4KB左右,而Session的存储容量则较大。
-
安全性:由于Cookie存储在客户端中,可能会被客户端的恶意操作进行篡改或盗用,因此Cookie的安全性相对较低。而Session存储在服务器端,相对来说比Cookie更安全。
-
用途:Cookie主要用于记录客户端的一些信息,例如用户上一次访问网站的时间、用户的偏好设置、广告跟踪等,但是它不能直接存储敏感信息。而Session通常用于记录用户的登录状态、用户的购物车、用户的浏览历史等敏感信息。
-
生命周期:Cookie可以设置一个固定的过期时间,可以在浏览器关闭后仍然存在,与会话无关。Session通常在浏览器关闭时自动销毁,或者设置一个固定的过期时间。
综上所述,Cookie和Session非常相似,但是,Cookie主要用于存储在客户端浏览器中的信息,而Session用于在服务器端保存敏感信息以维持用户状态。 在实际开发中,需要视情况而定选择使用哪种机制。
以下表格详细说明了Cookie和Session在几个方面的区别:
区别 | Cookie | Session |
---|---|---|
存储位置 | 客户端(浏览器) | 服务器端 |
存储容量 | 较小(通常为4KB左右) | 较大 |
安全性 | 相对低(易受篡改和盗用) | 相对高(存储在服务器端,较难被窃取) |
用途 | 记录客户端信息、广告跟踪等 | 记录用户敏感信息、登录状态等 |
生命周期 | 可设置过期时间,可以在浏览器关闭后存在 | 在浏览器关闭时自动销毁,或者设置过期时间 |
存储内容 | 任何类型的数据 | 任何类型的数据 |
性能和扩展 | 性能较好,对服务器无压力 | 可能增加服务器负担和开销 |
总结:Cookie和Session在存储位置、存储容量、安全性、用途、生命周期等方面有所不同。Cookie存储在客户端,容量较小,安全性相对较低,通常用于存储客户端信息。Session存储在服务器端,容量较大,安全性较高,常用于存储敏感信息。两者的生命周期也不同,Cookie可以设置过期时间,而Session通常在浏览器关闭时销毁。在性能和扩展方面,Cookie对服务器无压力,而Session可能增加服务器负担和开销。根据具体需求,开发者可适当选择使用Cookie或Session。
🍁 06. 为什么需要 Cookie 和 Session,他们有什么关联?
Cookie和Session在Web开发中扮演着重要的角色,它们的存在和关联有以下几个原因:
-
状态保持:Web是无状态的协议,即服务器在处理每个请求时都不会保留之前请求的信息。为了实现用户状态的跟踪和保持,需要使用Cookie和Session。Cookie可以在浏览器中存储一些用户状态信息,而Session则在服务器端存储用户的状态数据,两者相互配合可以实现用户状态的保持,例如用户的登录状态、购物车内容、浏览历史等。
-
个性化定制:Cookie和Session可以用于存储用户的个性化设置和偏好,例如语言选择、主题样式、首选项等。根据用户保存的信息,服务器可以向用户提供个性化的内容和服务。
-
用户认证和授权:Cookie和Session可以用于用户的认证和授权。当用户成功登录后,服务器可以为其创建一个会话,并将会话信息存储在Session中。通过校验会话的有效性,服务器可以判断用户是否已经登录,并根据用户的权限和角色进行相应的授权。
-
数据共享:Cookie和Session可以用于不同页面之间的数据共享。当用户在一个页面存储了一些信息,其他页面可以通过Cookie或Session来访问和使用这些信息。
-
追踪和分析:Cookie和Session可以用于追踪用户的行为和分析用户数据。通过记录用户的访问路径、点击量和活动时间等信息,服务器可以分析用户的兴趣和行为模式,从而提供更好的服务和定制化推荐。
关联方面,Cookie和Session有一定的关联性。通常情况下,服务器会将一个唯一的会话标识存储在Cookie中,并将其发送给浏览器。浏览器在后续的请求中会将该会话标识传递回服务器,服务器可以根据会话标识来从Session中获取相应的会话数据,实现用户状态的跟踪和数据的共享。
综上所述,Cookie和Session在Web开发中具有关键作用,用于实现用户状态的保持、个性化定制、用户认证和授权、数据共享、追踪和分析等功能。它们相互关联,通过Cookie传递会话标识来实现数据的存储和共享。
🍁 07. 禁用Cookie后,怎么办?
当浏览器禁用了Cookie之后,我们可以采取以下几种方式来应对:
-
使用其他机制:除了Cookie,还可以使用其他机制来实现用户状态的保持和数据的传递。例如,可以使用URL重写,将会话标识或其他状态信息添加到URL中进行传递。但这种方式会使URL变得冗长,并增加维护的难度。另一种选择是使用隐藏表单字段或URL参数来传递信息,但这种方式也有一些安全风险。
-
使用URL查询参数:可以将诸如会话标识等重要信息作为URL的查询参数附加到链接上,在页面之间传递这些信息。服务器可以解析URL中的参数来获取必要的会话信息,但需要注意这种方式会将重要的信息暴露在URL中,存在一定的安全风险。
-
使用HTML5的Web存储API:HTML5提供了一些机制来在客户端存储数据,包括Web Storage(localStorage和sessionStorage)和IndexedDB。使用这些API,可以将需要存储的数据存储在客户端的本地存储中,以供后续使用。
-
采用其他身份验证方式:Cookie通常用于用户认证和保持登录状态,但我们也可以考虑使用其他身份验证方式,例如使用基于令牌(Token)的身份验证机制。当用户成功登录后,服务器可以颁发一个加密的令牌给客户端,在后续的请求中,客户端需要在请求头或请求参数中携带该令牌来进行身份验证和授权。
-
提示用户启用Cookie:如果Cookie禁用对网站功能有很大影响,可以向用户发出提示,推荐他们启用Cookie。提供相应的指引,告知用户如何在他们所使用的浏览器中启用Cookie。
不同的解决方案适用于不同的场景,开发者可以根据具体需求和项目的特点选择合适的方式。同时,需要在实施时考虑到安全性和用户体验。
🍁 08. Session对象的常用方法?
Session对象是服务器端用来存储和管理用户会话信息的对象,常见的Session对象的方法包括:
-
setAttribute(String name, Object value)
: 将一个指定名称和值的属性存储到Session对象中。可以通过该方法设置用户的状态信息或其他需要存储的数据。 -
getAttribute(String name)
: 获取存储在Session对象中指定名称的属性值。可以使用该方法来获取之前设置的属性值。 -
removeAttribute(String name)
: 从Session对象中移除指定名称的属性。如果不再需要某个属性,可以使用该方法将其从Session对象中移除。 -
getId()
: 获取Session的唯一标识符。每个用户会话都有一个唯一的Session ID,通过该方法可以获取该ID。 -
invalidate()
: 使该Session对象无效,即销毁会话。调用该方法将会移除所有属性,并且不能再使用该Session对象。 -
setMaxInactiveInterval(int interval)
: 设置Session的最大非活动间隔时间,单位为秒。如果在指定的时间内没有活动(即没有请求访问该会话),服务器将会使该会话无效。 -
getLastAccessedTime()
: 获取上次访问该Session对象的时间。可以通过该方法获取会话的最后活动时间。 -
isNew()
: 判断该会话是否是新创建的。如果是新的会话,则返回true;否则返回false。
通过这些方法,开发者可以操作和管理Session对象中的属性,实现用户状态的跟踪、数据的存储和共享等功能。需要根据具体的开发环境和需求,选择合适的方法来操作Session对象。
🍁 09. 详细讲述一下你知道的四种会话跟踪技术?
会话跟踪是Web开发中的一个重要概念,用于在不同的HTTP请求中跟踪用户的状态。下面介绍四种常见的会话跟踪技术:
-
Cookie:Cookie是最常用的会话跟踪技术之一。在HTTP响应中,服务器可以发送一个包含会话标识的Cookie,浏览器在后续的请求中会将这个Cookie发送回服务器,使得服务器可以根据会话标识来识别和跟踪用户的状态。Cookie可以存储在浏览器中,并设置过期时间、域名和路径等参数,从而实现对会话的管理和控制。
-
URL重写:URL重写是一种通过URL传递会话参数来实现会话跟踪的技术。开发者可以将会话标识或其他状态信息添加到URL中作为查询字符串的参数传递,服务器通过解析URL参数来获取会话信息。这种方式的缺点是URL变得冗长,且会话信息暴露在URL中,存在安全风险。
-
隐藏表单字段:在HTML表单中,可以添加一个隐藏字段,将会话标识或其他状态信息添加到该字段中,以便在表单提交时传递给服务器。服务器通过解析隐藏字段来获取会话信息。这种方式的缺点是隐藏字段的值可以被修改和篡改,存在安全风险。
-
IP地址追踪:IP地址追踪是一种通过客户端的IP地址进行会话跟踪的技术。每个客户端都有一个唯一的IP地址,服务器可以记录客户端的IP地址和活动信息,来跟踪该客户端的会话状态。这种方式的缺点是客户端的IP地址可能被动态地分配和改变,存在不确定性和误判的情况。
总的来说,不同的会话跟踪技术各有优缺点,需要根据具体需求和开发环境来选择合适的技术。其中,Cookie技术是最常用的一种会话跟踪技术,具有稳定、安全、灵活等优点,其他技术在特定场景下也有一定的应用。
🍁 10. Web 应用中的四大作用域?
Web应用中的四大作用域是指在不同层级上存储和共享数据的方式,包括以下四种作用域:
-
请求作用域(Request Scope):请求作用域是指数据的生命周期仅限于单个HTTP请求。在请求作用域中,数据只在当前请求期间有效,不同的请求之间数据不会被共享。一般而言,请求作用域的数据存储在HttpServletRequest对象中,可以通过HttpServletRequest对象来读取和设置请求作用域的数据。
-
会话作用域(Session Scope):会话作用域是指数据的生命周期从用户会话开始,直到用户会话结束。在会话作用域中,数据存储在服务器端的会话对象中,不同的请求可以通过访问会话对象来共享数据。一般而言,会话作用域的数据存储在HttpSession对象中,可以通过HttpSession对象来读取和设置会话作用域的数据。
-
应用程序作用域(Application Scope):应用程序作用域是指数据的生命周期从Web应用启动开始,直到Web应用关闭。在应用程序作用域中,数据存储在服务器端的ServletContext对象中,不同的用户会话和请求可以通过访问ServletContext对象来共享数据。一般而言,应用程序作用域的数据存储在ServletContext对象中,可以通过ServletContext对象来读取和设置应用程序作用域的数据。
-
页面作用域(Page Scope):页面作用域是指数据的生命周期仅限于当前页面。在页面作用域中,数据只在当前页面有效,不同的页面之间数据不会被共享。一般而言,页面作用域的数据存储在PageContext对象中,可以通过PageContext对象来读取和设置页面作用域的数据。
通过使用不同的作用域,开发者可以根据数据的生命周期和共享需求来选择合适的作用域,实现数据的存储和共享。需要注意作用域的选择应该符合数据的访问频率、安全性和资源消耗等考虑因素。
🍁 11. 在 JSP 中如何设置 Cookie?
要在JSP页面中设置Cookie,可以使用以下步骤:
1. 创建一个Cookie对象,如下所示:
Cookie cookie = new Cookie("name", "value");
其中,"name"指定Cookie的名称,"value"指定Cookie的值。
2. 可以设置一些选项,如设置Cookie的过期时间,如下所示:
cookie.setMaxAge(60*60*24); // 过期时间为一天
3. 将Cookie添加到HTTP响应中,如下所示:
response.addCookie(cookie);
其中,response是JSP页面的HttpServletResponse对象。
下面是一个完整设置Cookie的例子:
<%@ page contentType="text/html; charset=UTF-8" %>
<%Cookie cookie = new Cookie("username", "lisi");cookie.setMaxAge(60*60*24); // 过期时间为一天response.addCookie(cookie);
%>
<html>
<head><title>设置Cookie</title>
</head>
<body><h1>成功设置了Cookie!</h1>
</body>
</html>
在这个例子中,我们在JSP页面中创建了一个名为"username",值为"lisi"的Cookie,并设置了过期时间为一天,然后将其添加到了HTTP响应中。在浏览器中访问该JSP页面后,该Cookie会被设置并发送到浏览器中保存。
🍁 12. Cookie 的应用场景?
Cookie是一种在Web中广泛应用的客户端存储技术,它可以在客户端中存储和读取少量的数据,并在浏览器和服务器之间传递信息。下面是Cookie的几个典型应用场景:
-
用户会话管理:Cookie最常见的应用场景之一是用户会话管理。当用户首次访问网站或应用时,可以创建一个唯一的会话标识,并将其存储到Cookie中。在后续的请求中,服务器可以读取这个Cookie来识别和跟踪用户的状态,从而实现对用户会话的管理和控制。
-
用户偏好设置:网站或应用可以将用户的偏好设置存储到Cookie中,如用户的语言、主题、字体等设置。当用户再次访问网站或应用时,可以读取这些Cookie来调整和恢复用户的偏好设置。
-
购物车功能:在电商网站中,Cookie也常用于实现购物车功能。当用户选择了商品加入购物车时,网站会将商品信息存储到Cookie中,并在结算时读取这些Cookie来生成订单。
-
广告跟踪:Cookie还可以用于广告跟踪。在用户浏览网站或搜索时,广告商可能会向用户的浏览器中存储一些Cookie,以便记录用户的浏览行为,从而更好地投放广告。
需要注意的是,由于Cookie存储在客户端,因此Cookie存在着信息泄露、篡改和安全风险。开发者需要在使用Cookie时加强安全措施,如对Cookie进行加密、设置过期时间、限制Cookie的访问范围等。同时,用户也应该注意保护个人隐私和浏览安全,如关闭第三方Cookie等。
🍁 13. Session 的应用场景?
Session 是服务器端用于存储和管理用户会话信息的一种技术。它通过在服务器端创建一个唯一的会话标识,并将会话数据保存在服务器上,为每个用户维护一个独立的会话状态。下面是 Session 的几个典型应用场景:
-
用户登录认证:当用户通过用户名和密码登录网站或应用时,服务器可以创建一个会话,并在会话中存储用户的登录状态信息,如用户ID、角色、权限等。在用户的后续请求中,服务器可以通过会话标识来识别用户,并验证用户的身份和权限。
-
购物车功能:在电商网站中,购物车通常需要跨多个请求来保存用户的商品选择。服务器可以使用 Session 来存储用户的购物车信息,当用户添加商品、修改数量或进行结算时,可以读取和更新 Session 中的购物车数据。
-
数据共享:在某些场景下,需要在不同的页面或请求之间共享数据。Session 可以作为一个中间存储,存储一些需要在用户不同请求之间传递的数据,避免了在每个请求中显式传递数据的麻烦。
-
会话跟踪与状态管理:Session 可以用于跟踪和管理用户的会话状态。通过在 Session 中存储一些标识或状态,服务器可以根据用户的会话状态来控制和管理业务逻辑,如用户的操作流程、流程的上下文信息等。
需要注意的是,由于 Session 数据存储在服务器端,因此它的存储对服务器性能有一定的影响。开发者应该合理使用 Session,避免存储过多的数据或敏感的信息,及时清理不再需要的 Session 数据,以减少服务器的负载和资源消耗。另外,Session 也需要考虑分布式环境下的共享和同步问题,如使用 session 集群或共享存储来实现 Session 共享。
🍁 14. 请简述 Cookie, Session 和 Application 它们的区别?
Cookie、Session和Application均是在Web开发中常用的三种技术,它们各自有着不同的作用和应用场景。以下是它们之间的主要区别:
- 作用范围不同
Cookie是通过在客户端存储和传递信息的技术,它的作用范围是在单个客户端(浏览器)内部。Cookie通常用于存储一些和用户相关的诸如用户ID、账号等信息。
Session是服务器端存储和管理用户会话信息的技术,它的作用范围是在单个用户的会话(Session)内部,所有在同一会话内的请求都可以共享会话数据。Session通常用于实现用户认证、购物车、数据共享等功能。
Application是将信息存储在服务器端的全局变量,它的作用范围是在整个应用程序内部,所有请求都可以共享Application数据。Application通常用于存储应用程序全局的配置、缓存等数据。
- 存储位置不同
Cookie是存储在客户端浏览器中的文本文件或内存中的数据,由客户端浏览器负责管理。
Session是存储在服务器端内存或配置的外部Session存储数据库中的数据。
Application是存储在服务器端ServletContext对象中的全局变量,所有客户端请求都可以访问。
- 数据访问方式不同
Cookie可以通过document.cookie属性来访问、设置和删除客户端的Cookie。
Session可以通过JSP和Servlet的HttpSession对象来访问、设置和删除Session数据。
Application可以通过JSP和Servlet的ServletContext对象来访问、设置和删除Application数据。
总的来说,Cookie、Session和Application各自有各自使用的场景,开发人员应依据具体情况选择合适的技术来实现业务功能。在使用时需要注意数据的安全性和性能开销。
以下是 Cookie、Session 和 Application 之间的区别的详细说明表格:
特性 | Cookie | Session | Application |
---|---|---|---|
存储位置 | 客户端(浏览器)内部 | 服务器端内存或存储库 | 服务器端内存(ServletContext 对象) |
作用范围 | 单个客户端 | 单个用户 | 整个应用程序 |
数据访问方式 | document.cookie 属性 | HttpSession 对象 | ServletContext 对象 |
存储方式 | 文本文件或内存 | 内存或数据库 | 内存 |
数据安全性 | 低 | 高 | 中等 |
性能开销 | 小到中等 | 中等 | 中等 |
主要应用场景 | 存储用户信息和偏好设置、实现购物车功能、广告跟踪等 | 用户认证、购物车、数据共享等 | 全局配置、缓存等 |
需要注意的是,表格中的描述是一般情况下的典型应用场景和特性,实际使用时还要根据具体需求进行选择,并考虑安全性和性能等方面的因素。
🍁 15. 如何考虑分布式 Session 问题?
在考虑分布式 Session 问题时,我们需要解决以下几个关键点:
-
Session 共享:由于分布式环境下不同服务器之间需要共享 Session 数据,我们需要确保用户的请求可以在任意服务器上获得相同的 Session 数据。可以使用以下方法实现 Session 共享:
- 使用数据库或缓存作为共享存储:将 Session 数据存储在共享数据库(如MySQL、MongoDB)或分布式缓存(如Redis、Memcached)中,不同服务器通过读写共享存储来访问和更新 Session 数据。
- 使用共享文件系统:将 Session 数据存储在共享文件系统(如NFS、GlusterFS)中,不同服务器通过文件系统的访问来共享 Session 数据。
- 使用分布式会话管理工具:如Tomcat支持通过Tomcat Session Clustering实现Session共享,使用类似Sticky Session或Session复制的机制让用户的请求始终路由到同一个服务器。
-
Session 持久化:为了在服务器宕机或重启后能够恢复用户的会话状态,我们需要将 Session 数据进行持久化存储。可以使用以下方法实现 Session 持久化:
- 将 Session 数据存储在关系数据库或NoSQL数据库中,如MySQL、MongoDB等,并进行定期备份。
- 将 Session 数据存储在分布式文件系统中,如HDFS等。
- 使用内存数据库或缓存中间件,如Redis、Memcached等,它们提供了持久化功能,将 Session 数据存储到磁盘上。
-
Session 一致性:在分布式环境下,多个服务器之间的 Session 数据需要保持一致性,确保数据的准确性和完整性。可以采用以下方法来处理 Session 一致性:
- 使用分布式缓存中间件,如Redis的replication或cluster模式,确保不同服务器上的 Session 数据是一致的。
- 使用数据复制或同步机制,如基于数据库的主从复制,确保不同服务器的 Session 数据是一致的。
- 使用分布式协调服务,如ZooKeeper,协调不同服务器上的 Session 数据状态。
-
Session 负载均衡:分布式环境中,需要通过负载均衡来分发用户请求到不同服务器上,同时保持用户的 Session 数据一致。可以使用以下方法来实现 Session 负载均衡:
- 使用基于Cookie的粘性会话(Sticky Session),即将用户的请求始终分发到同一台服务器上,以保持 Session 数据一致。
- 使用会话复制(Session Replication)机制,将用户的会话状态复制到多个服务器上。
需要注意的是,在设计和实现分布式 Session 时要考虑数据安全性、性能和可扩展性等因素。合理选择合适的方案来满足应用程序的需求。
🍁 16. 如何解决跨域请求?Jsonp 跨域的原理是什么?
要解决跨域请求,可以使用以下几种常见的方法:
-
CORS(Cross-Origin Resource Sharing):CORS 是一种由浏览器支持的跨域解决方案。服务器可以在响应中添加一些特定的头部信息,如 Access-Control-Allow-Origin,来允许指定的源进行跨域访问。
-
JSONP(JSON with Padding):JSONP 是一种利用
<script>
标签可以跨域加载资源的特性来实现跨域请求的方法。具体原理是在客户端创建一个动态的<script>
标签,将请求的数据作为回调函数参数传递给服务器。服务器会将数据包装在回调函数中返回,从而实现跨域数据传输。 -
代理服务器:前端可以通过与同域的代理服务器通信来转发请求,然后由代理服务器去请求目标服务器,并将结果返回给前端。由于代理服务器与目标服务器是同域的,所以不存在跨域问题。
至于 JSONP 跨域的原理,它是通过动态创建 <script>
标签来实现跨域请求的。具体步骤如下:
- 前端代码通过
<script>
标签创建一个指向跨域服务器的 URL,将需要传递的数据作为 URL 参数。 - 跨域服务器接收到请求后,将数据包装在一个指定的回调函数中,并作为响应返回。
- 前端在页面上定义相应的回调函数,在响应返回时触发该函数,并获取响应数据。
JSONP 的关键在于前端通过脚本标签的方式进行跨域请求和响应处理,充分利用了脚本标签可以跨域加载资源的特性。但需要注意的是,JSONP 只支持 GET 请求,且存在安全风险,因为服务端返回的代码会在前端执行,所以需要谨慎使用。CORS 更为安全和灵活,是现代跨域解决方案的首选。
关于 JSONP 原理的细节:
- 创建
<script>
标签时,需要在 URL 中添加一个回调函数参数名(如 callback、jsonp),服务器将在响应中将数据包装在该回调函数中。 - 由于 JSONP 请求的返回类型是 JavaScript 代码,所以服务端返回的数据必须是可执行的 JavaScript 代码。通常采用约定俗成的方式,以回调函数名作为参数名,将数据包装在回调函数中返回。例如:callback(‘{“name”:“张三”,“age”:20}’);
- 回调函数名需要确保唯一性,通常采用依据时间戳或随机数创建的方式生成,以确保不会与页面已经定义的函数名重复。前端要在定义回调函数之后,再通过脚本标签的方式发起请求。
- 服务端返回的数据需要保证是可解析为 JSON 对象或 JSONP 回调函数格式的,否则前端无法避免会出现语法错误。在 JSONP 方式下,服务端不支持在响应头中返回内容类型(Content-Type)、状态码等标准 HTTP 头部,通常只能返回 200 OK 状态码和纯 JavaScript 代码。