JavaWeb-08Cookie和Session会话技术

Cookie

[!tip]

Cookie是一种在客户端存储数据的小型文本文件,由Web服务器发送到用户的浏览器,然后由浏览器保存。它们通常用于跟踪、识别和存储用户在网站上的各种信息,以实现个性化的用户体验或跟踪用户的行为。

  • Cookie是服务器通知客户端保存键值对的一种技术。
  • 客户端有了Cookie后,每次请求都发送给服务器
  • 每个Cookie的大小不能超过4kb,不能保存中文,括号等特殊字符

Cookie的关键特点

  1. 持久性: 可以设置Cookie的过期时间,使其在浏览器关闭后仍然保留在用户的计算机上一段时间。

  2. 域名关联: Cookie与特定的域名相关联,只有与创建Cookie的域名匹配的HTTP请求才会发送该Cookie。

  3. 大小限制: 浏览器对于单个域名下的Cookie数量和总大小有限制。

  4. 安全性: Cookie可以设置为只在安全连接(HTTPS)中传输,以增强安全性。

  5. 客户端存储: 存储在Cookie中的信息保存在用户的计算机上,因此可以在客户端进行检索和修改。这也意味着Cookie中的信息可以被用户查看和操纵,因此不应存储敏感信息,如密码等。

Cookie常见的用途

  • 会话管理: 用于跟踪用户的会话状态。例如,保持用户登录状态,以便在用户浏览多个页面时保持其登录状态。

  • 个性化内容: 根据用户的偏好和行为提供个性化的内容。例如,保存用户的语言选择、主题偏好或购物车内容。

  • 广告跟踪: 用于跟踪用户的浏览行为,以向其提供相关的广告。例如,根据用户的兴趣来定向广告。

  • 安全认证: 在一些情况下,Cookie可以用于实现基于令牌的身份验证和安全授权机制,以提供更安全的用户体验。

尽管Cookie在Web开发中非常常见,但它们也存在一些限制和安全风险。例如,Cookie可能会被篡改、截获或滥用,因此开发人员应该注意在使用Cookie时采取适当的安全措施,如使用HTTPS、限制Cookie的访问范围等。

Cookie的创建

  1. 客户端(浏览器)一开始没有cookie
  2. 第一次发送请求,服务器创建cookie,并通知客户端保存cookie
  3. 客户端收到响应后,发现有set-cookie响应头,就去看一下有没有这个cookie,没有就创建,有就修改
  4. 客户端后面的请求都会带着cookie
  5. 服务端获取客户端发送过来的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]

方案一:

  1. 创建一个要修改的同名的Cookie对象
  2. 在构造器,同时赋予新的Cookie值
  3. 调用response.addCookie(Cookie)

[!note]

方案二:

  1. 先查找需要修改的Cookie对象
  2. 调用setValue()方法赋予新的Cookie值
  3. 通知客户端保存修改

Cookie的存活设置

setMaxAge(int maxAge)方法

maxAge含义
正整数Cookie 将在指定的秒数后过期。
0Cookie 将被立即删除。
负整数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。

免用户名登录

  1. 客户端/浏览器输入用户名和密码,第一次发送请求
  2. 服务器接收到用户名和密码判断对错,如果正确就把用户名保存到cookie中发送给客户端
  3. 客户端后面的请求都带着用户名

Cookie编码与解码

[!tip]

Cookie 编码与解码在 Web 开发中是非常重要的,其主要原因有以下几点:

  1. 特殊字符处理: Cookie 中可能包含特殊字符,例如空格、等号、分号等,这些字符在 HTTP 请求中具有特殊含义。编码 Cookie 可以确保其中的特殊字符不会干扰解析过程。

  2. 安全性考虑: 如果用户提供了可能被视为恶意的数据,如 HTML 标签或 JavaScript 代码,将这些数据直接写入 Cookie 可能会导致跨站点脚本攻击(XSS)。编码 Cookie 可以帮助防止这种情况的发生。

  3. 兼容性: 不同的浏览器和服务器对于 Cookie 中的特殊字符的处理方式可能不同。编码 Cookie 可以提高跨浏览器和跨平台的兼容性。

  4. 数据完整性: 如果 Cookie 中包含了某些特殊字符,这些字符可能会被错误地解析或截断,导致数据的不完整性。编码 Cookie 可以确保数据在传输过程中的完整性。

  5. 避免歧义: 对于一些可能具有歧义的字符,如空格或者 Unicode 字符,编码 Cookie 可以帮助消除歧义,确保数据能够被正确地解析。

使用java.net.URLEncoderjava.net.URLDecoder类来进行Cookie的编码和解码。

  • 编码URLEncoder.encode("姓名", "UTF-8")
  • 解码URLEncoder.encode("姓名", "UTF-8")

Session

session简介

  • Session就是一个接口(HttpSession)。
  • Session就是会话,他是用来维护一个客户端和服务器之间关联的一种技术。
  • 每个客户端都有自己的一个Session会话。
  • Session会话中,我们经常用来保存用户登录之后的信息。

[!tip]

在JavaWeb中,Session是一种用于在客户端和服务器之间跟踪用户状态的机制。它允许服务器在用户访问网站时存储和检索信息,以便在用户多次请求之间保持状态。

Session通常用于以下几个方面:

  1. 用户身份验证和授权:当用户成功登录时,服务器可以创建一个Session来存储用户的身份信息,以便在后续的请求中验证用户的身份和权限。

  2. 跟踪用户状态:Session可以用于跟踪用户在网站上的活动和状态。例如,可以在Session中存储用户的购物车内容、偏好设置等信息。

  3. 实现购物车功能:通过Session,可以在用户浏览网站时跟踪他们选择的商品,并在结账时保存购物车的内容。

  4. 实现单点登录(SSO):在多个相关联的应用程序之间共享用户登录状态,以便用户只需登录一次,然后可以访问所有应用程序而无需再次登录。

在JavaWeb中,Session通常是通过HttpServletRequest对象来管理的。当用户第一次访问服务器时,服务器会为该用户创建一个唯一的Session,并将一个Session ID(通常是一个长随机字符串)发送给客户端,客户端会在后续的请求中将该Session ID发送回服务器。服务器使用这个Session ID来识别用户,并根据需要检索和更新与该Session相关的信息。

Session在JavaWeb中通常使用以下几种方式实现:

  1. 基于Cookie的Session管理:Session ID通常存储在客户端的Cookie中,并在每个请求中发送回服务器。这种方式简单易用,但受到Cookie的限制和安全性的考虑。

  2. URL重写:在URL中包含Session ID,而不是使用Cookie。这种方式通常用于在不支持Cookie的环境中(如移动设备)实现Session管理。

  3. 隐藏表单字段:在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之间关联

  1. Cookie

    • Cookie是最常用的维持会话状态的机制之一。当服务器创建一个Session时,它会生成一个唯一的Session ID,并将该Session ID存储在一个名为Cookie的小型文本文件中。
    • 浏览器在收到服务器响应时会将Cookie保存在本地。每当浏览器向服务器发送请求时,它会自动将与该网站相关联的Cookie一起发送给服务器,其中包含了Session ID。
    • 这样,服务器就可以根据Session ID识别用户,并将用户的请求与正确的Session关联起来,从而实现会话跟踪。
  2. URL重写

    • 在某些情况下,如果浏览器不支持Cookie或者Cookie被禁用,可以使用URL重写技术来传递Session ID。
    • 服务器会将Session ID附加到每个URL中,以便在用户点击链接或者提交表单时将Session ID传递给服务器。
    • 这样服务器就能够根据URL中的Session ID来识别用户,从而维持会话状态。
  3. 隐藏表单字段

    • 在HTML表单中可以添加一个隐藏字段,用于存储Session ID。当用户提交表单时,该隐藏字段会一同发送给服务器。
    • 服务器接收到请求后,就能够从隐藏字段中提取Session ID,并识别用户的会话状态。

这些技术在不同情况下都可以用来建立浏览器和Session之间的关联,以实现会话跟踪和状态维护。选择哪种技术取决于应用的特定需求以及对于安全性和性能的考虑。通常情况下,Cookie是最常见、最方便的方法,但在某些情况下,URL重写和隐藏表单字段可能会更为适用。

[!caution]

Session技术,底层是基于Cookie技术来实现的

Session用途

  1. 用户认证和授权:Session可用于跟踪用户的登录状态和权限,以验证用户的身份并控制其访问权限。一旦用户登录成功,服务器可以创建一个Session,并在Session中存储用户的身份信息和权限信息,以便在用户进行其他操作时进行验证。

  2. 跟踪用户状态和活动:通过Session,服务器可以跟踪用户在网站上的活动和状态。例如,可以在Session中存储用户的浏览历史、购物车内容、偏好设置等信息,从而提供个性化的服务和体验。

  3. 购物车功能:Session常用于实现网上购物车功能。当用户在网站上选择商品时,服务器会将商品信息存储在用户的Session中,直到用户完成购买或离开网站时才清除Session中的数据。

  4. 缓存数据:Session可以用作临时的数据缓存区域,存储一些需要在用户会话期间共享和访问的数据。这些数据可以是来自数据库、外部API或其他来源的结果,以提高数据访问速度和性能。

  5. 单点登录(SSO):Session可用于实现单点登录功能,允许用户在多个相关联的应用程序之间共享登录状态,从而避免用户重复登录。一旦用户登录成功并创建了一个Session,其他应用程序可以共享同一Session来验证用户身份。

  6. 防止重复提交:Session可以用于防止用户重复提交表单或操作。例如,在用户提交表单时,服务器可以将表单数据存储在Session中,并在处理完表单提交后将Session中的数据清除,从而防止用户进行重复提交。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[猫玖]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值