文章目录
1.Cookie
简而言之,cookie是存储在客户端的一小部分数据,服务器在与客户端进行通信时会使用它们。
它们用于在发送后续请求时识别客户端。它们还可以用于将某些数据从一个servlet传递到另一个servlet。
有关更多详细信息,请参阅本文。
1.1 创建一个cookie
所述cookie类在定义javax.servlet.http包封装。
要将其发送给客户端,我们需要创建一个并将其添加到响应中:
Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);
1.2 设置Cookie的到期时间
我们可以设置最大年龄(使用方法maxAge(int)),该方法定义给定Cookie的有效时间为多少秒:
uiColorCookie.setMaxAge(60*60);
我们将最长年龄设置为一小时。在此时间之后,客户端(浏览器)无法在发送请求时使用Cookie,也应将其从浏览器缓存中删除。
1.3 设置Cookie域
Cookie API中的另一个有用的方法是setDomain(String)。
这使我们可以指定客户端应将其交付给的域名。这也取决于我们是否明确指定域名。
让我们为cookie设置域:
uiColorCookie.setDomain("example.com");
该Cookie将传递给example.com及其子域提出的每个请求。
如果我们未明确指定域,则将其设置为 创建cookie的域名。
例如,如果我们从example.com创建cookie,并将域名保留为空,那么它将被发送到www.example.com(不包含子域)。
除了域名,我们还可以指定路径。接下来让我们看一下。
1.4 设置Cookie路径
该路径指定将cookie传递到的位置。
如果我们明确指定路径,则Cookie将被传递到给定的URL及其所有子目录:
uiColorCookie.setPath("/welcomeUser");
隐式地,它将被设置为创建cookie及其所有子目录的URL。
现在,让我们集中讨论如何在Servlet中检索它们的值。
1.5 在Servlet中读取Cookies
Cookie由客户端添加到请求中。客户端检查其参数,并决定是否可以将其传递到当前URL。
我们可以通过对传递给Servlet的请求(HttpServletRequest)调用getCookies()来获取所有cookie 。
我们可以遍历此数组并搜索所需的数组,例如,通过比较它们的名称:
public Optional<String> readCookie(String key) {
return Arrays.stream(request.getCookies())
.filter(c -> key.equals(c.getName()))
.map(Cookie::getValue)
.findAny();
}
1.6 删除Cookie
要从 浏览器中删除Cookie,我们必须向响应添加一个同名的cookie,但其maxAge值应设置为0:
Cookie userNameCookieRemove = new Cookie("userName", "");
userNameCookieRemove.setMaxAge(0);
response.addCookie(userNameCookieRemove);
删除Cookie的示例用例是用户注销操作-我们可能需要删除一些为活动用户会话存储的数据。
现在我们知道了如何处理Servlet中的cookie 。
接下来,我们将介绍我们从访问非常频繁的另一个重要目标的Servlet -一个会话对象。
2. HttpSession
在HttpSession中,对于跨不同存储请求用户相关的数据的另一种选择。会话是保存上下文数据的服务器端存储。
数据不会在不同的会话对象之间共享(客户端只能从其会话访问数据)。它还包含键值对,但是与cookie相比,会话可以包含对象作为值。存储实现机制取决于服务器。
会话通过cookie或请求参数与客户端匹配。更多信息可以在这里找到。
2.1 获取会话
我们可以直接从请求获取HttpSession:
HttpSession session = request.getSession();
如果上面的代码不存在,它将创建一个新的会话。我们可以通过调用以下命令实现相同的目的:
request.getSession(true)
如果我们只想获取现有会话而不创建新会话,则需要使用:
request.getSession(false)
如果我们是第一次访问JSP页面,那么默认情况下会创建一个新会话。我们可以通过将session属性设置为false来禁用此行为:
<%@ page contentType="text/html;charset=UTF-8" session="false" %>
在大多数情况下,Web服务器使用cookie进行会话管理。创建会话对象后,服务器将创建一个带有JSESSIONID键和标识会话的值的cookie 。
2.2 会话属性
会话对象提供了许多方法来访问(创建,读取,修改,删除)为给定用户会话创建的属性:
- setAttribute(String,Object) ,它使用键和新值创建或替换会话属性
- getAttribute(String)读取具有给定名称(键)的属性值
- removeAttribute(String)删除具有给定名称的属性
我们还可以通过调用getAttributeNames()轻松检查已经存在的会话属性。
如前所述,我们可以从请求中检索会话对象。当我们已经有了它时,我们可以快速执行上述方法。
我们可以创建一个属性:
HttpSession session = request.getSession();
session.setAttribute("attributeKey", "Sample Value");
可以通过其键(名称)获得属性值:
session.getAttribute("attributeKey");
我们可以删除不再需要的属性:
session.removeAttribute("attributeKey");
用户会话的一个众所周知的用例是,当用户从我们的网站注销时,存储的全部数据将失效。会话对象为其提供了一种解决方案:
session.invalidate();
此方法从Web服务器中删除了整个会话,因此我们无法再从中访问属性。
HttpSession对象具有更多方法,但是我们提到的方法是最常见的。
翻译于:
🍎QQ群【837324215】
🍎关注我的公众号【Java大厂面试官】,一起学习呗🍎🍎🍎