1.概述
在本文中,我们将介绍如何使用Servlet处理Java中的cookie和会话。
另外,我们将简单地介绍什么是cookie,并探讨它的一些示例用例。
2. Cookie基础
简而言之,cookie是存储在客户端的一小部分数据,服务器在与客户端通信时会使用它们。
它们用于在发送后续请求时识别客户端。
它们还可以用于将某些数据从一个servlet传递到另一个servlet。
2.1. 创建一个cookie
Cookie
类在定义***javax.servlet.http***包中。
要将其发送给客户端,我们需要创建一个Cookie
并将其添加到响应中:
Cookie urlCookie = new Cookie("url", "ripjava.com");
response.addCookie(uiColorCookie);
但是,它还有很多方法。
2.2 设置Cookie的到期日期
我们可以使用maxAge(int)
方法来设置Cookie最大有效时间,该方法定义给定Cookie的有效时间为秒:
urlCookie.setMaxAge(60*60);
上面的代码,将有效时间设置为1个小时。
在此时间之后,客户端(浏览器)在发送请求时将无法使用Cookie,并且还应该将其从浏览器缓存中删除。
2.3 设置Cookie的域名**
Cookie
类中的另一个有用的方法是setDomain(String)
。
这使我们可以指定客户端应将其交付给的域名。这也取决于我们是否明确指定域名。
urlCookie.setDomain("ripjava.com");
客户端(浏览器)会将Cookie传递给ripjava.com及其子域提出的每个请求。
如果我们未明确指定域,则将其设置为 创建cookie 的域名。
比如,如果我们从ripjava.com创建cookie,并没有设置域名,那么它将被发送到www.ripjava..com(不包含子域名
)。
除了域名,我们还可以指定路径。
2.4 设置Cookie路径
该路径指定将cookie传递到的位置。
如果我们明确指定路径,则Cookie将被传递到给定的URL及其所有子目录:
urlCookie.setPath("/blog");
默认的,它将被设置为创建cookie及其所有子目录的URL。
2.5 在Servlet中读取Cookies
Cookie由客户端添加到请求中。客户端检查其参数,并决定是否可以将其传递到当前URL。
我们可以通过对传递给Servlet的请求对象(HttpServletRequest
)调用getCookies()
来获取所有cookie 。
我们可以遍历此cookie数组并搜索所需的数组,
例如,通过cookie的名称:
public Optional<String> readCookie(String key) {
return Arrays.stream(request.getCookies())
.filter(c -> key.equals(c.getName()))
.map(Cookie::getValue)
.findAny();
}
2.6 删除Cookie
要从浏览器中删除Cookie
,我们必须在响应中添加一个相同名称的cookie,但maxAge值应设置为0。
Cookie urlCookie = new Cookie("url", "");
urlCookie.setMaxAge(0);
response.addCookie(urlCookie);
最常用到删除Cookie的是用户注销操作。我们可能需要删除一些为活动用户会话存储的数据。
接下来,我们将介绍HttpSession对象。
3. HttpSession对象
HttpSession
是跨不同请求保存用户相关的数据的另一种选择。
Session是保存上下文数据的服务器端存储。
数据不会在不同的会话对象之间共享(客户端只能从其会话访问数据)。
它也包含键值对,但是与cookie相比,会话可以包含对象作为值。存储实现机制取决于服务器。
3.1 获取Session
我们可以直接从请求对象中获取HttpSession:
HttpSession session = request.getSession();
上面的代码中,如果HttpSession不存在,它将创建一个新的Session。
我们也可以通过调用以下方法来实现相同目的:
request.getSession(true)
如果我们只想获取现有Session而不创建新Session,则需要使用
request.getSession(false)
如果我们是第一次访问JSP页面,那么默认情况下会创建一个新Session。
我们可以通过将session属性设置为false来禁用此行为*:*
<%@ page contentType="text/html;charset=UTF-8" session="false" %>
在大多数情况下,Web服务器使用cookie进行Session管理。创建Session对象后,服务器将创建一个带有JSESSIONID键和标识会话的值的cookie 。
3.2 Session属性
Session对象提供了许多方法来访问(创建,读取,修改,删除)为给定用户会话创建的属性:
-
setAttribute(String, Object): 创建或替换键和新值的属性
-
getAttribute(String) :读取具有给定名称(键)的属性值
-
removeAttribute(String):删除具有给定名称的属性
我们还可以通过调用getAttributeNames()
轻松检查已经存在的Session属性。
如前所述,我们可以从请求中检索会话对象。当我们已经创建了Session时,我们可以快速执行上述方法。
我们可以创建一个属性:
HttpSession session = request.getSession();
session.setAttribute("attributeKey", "Sample Value")
可以通过其键(名称)获得属性值:
session.getAttribute("attributeKey");
我们还可以在不再需要某个属性时将其删除:
session.removeAttribute("attributeKey");
如果用户从我们的网站注销时,存储的全部数据将失效。Session对象为其提供了一种解决方案:
session.invalidate();
invalidate()
方法从Web服务器中删除了整个会话,之后,我们将无法再从中访问属性。
HttpSession
对象具有更多方法,这里我们只提到了常见的方法。
4 总结
在本文中,我们介绍了会话管理的两种机制,它们允许我们在对服务器的后续请求之间存储用户数据。
请记住,HTTP协议是无状态的,因此必须在请求之间维护状态。