Java的Cookie和Session配合解决会话管理问题

目录

会话管理概述

为什么需要会话管理

会话管理实现的手段

Cookie概述

Cookie的使用

Cookie的时效性

Cookie的提交路径

Session

HttpSession概述

HttpSession的使用

HttpSession时效性

cookie和session结合使用


会话管理概述

为什么需要会话管理

在Java应用程序中,会话管理是一种关键的技术,它允许服务器在多个HTTP请求之间保持状态信息。这在许多情况下都是必要的,主要原因包括:

  • 维护用户状态:会话管理允许服务器跟踪用户在应用程序中的活动状态。通过会话,服务器可以确定用户是谁,他们已经做了什么,以及他们下一步可能会做什么。这对于创建个性化的用户体验和提供定制的服务至关重要。
  • 处理用户身份验证:许多应用程序需要用户登录才能访问受保护的资源。会话管理提供了一种机制,可以在用户进行身份验证后跟踪他们的登录状态,并在会话过程中验证他们的访问权限。
  • 跨页面数据传递:在Web应用程序中,用户通常会跳转到不同的页面来执行各种操作。会话管理允许服务器在这些页面之间传递数据,而不需要将所有信息都包含在每个请求中。
  • 状态保持:有些应用程序需要在多个HTTP请求之间保持特定状态信息。例如,在购物车应用程序中,服务器需要跟踪用户添加到购物车中的商品,以便在用户继续浏览网站时保持购物车的状态。
  • 防止CSRF攻击:会话管理还可以用于实施对跨站请求伪造(CSRF)攻击的保护。通过将随机生成的令牌与用户会话关联起来,并在每个请求中验证令牌的有效性,可以确保请求来自于合法的用户操作,而不是恶意的攻击者。

会话管理实现的手段

Cookie和Session是常见的会话管理手段,它们通常一起使用来实现对用户会话的跟踪和管理。

  • Cookie是在客户端存储少量数据的机制,它们是由服务器发送到客户端,并在客户端的浏览器中存储。Cookie通常用于存储诸如用户身份验证令牌、用户首选项等信息。由于Cookie是存储在客户端的,因此它们可以在客户端的不同请求之间传递,从而实现对用户的持续跟踪。
  • Session是在服务器端维护的与客户端相关的数据结构。在Java中,通常是通过HttpSession对象来实现会话管理。服务器会为每个客户端请求创建一个唯一的会话ID,并将此ID与相应的会话数据关联起来。Session通常用于存储用户的状态信息、购物车内容、用户登录信息等。相对于Cookie,Session可以存储更多的信息,并且在服务器端进行管理,因此更安全。

通过将Cookie和Session结合使用,可以实现对用户会话的全面管理,提高了应用程序的安全性和可靠性。

Cookie概述

Cookie是一种常见的客户端会话技术,用于在客户端(通常是浏览器)和服务器之间传递少量数据。这些数据通常由服务器生成并在浏览器中存储,然后在将来的HTTP请求中发送到同一服务器。

  • 服务端创建和发送Cookie:服务器生成Cookie并将其包含在HTTP响应中,通常通过设置Set-Cookie响应头。Tomcat等服务器容器会处理这些Cookie并将其发送给客户端。
  • 客户端发送Cookie:一旦客户端(浏览器)接收到Cookie,它会在之后的每个请求中自动包含Cookie数据,以便将其发送回服务器。这是通过在HTTP请求头中包含Cookie字段来实现的。
  • Cookie的格式:Cookie通常是以键值对的格式存储的,它们包含了一些用于识别用户和跟踪会话状态的信息。从Tomcat 8.5开始,Cookie可以保存中文字符,但并不推荐在Cookie中存储大量的中文数据。
  • 安全性考虑:由于Cookie是存储在客户端的,因此相对容易被窃取或篡改。因此,通常不建议将敏感信息或安全性影响较大的数据存储在Cookie中。

Cookie的一些常见的应用场景示例:

  1. 用户身份验证:在用户成功登录后,服务器可以创建一个包含用户身份验证令牌的Cookie,并在客户端存储该Cookie。之后,客户端在每个请求中都会将该Cookie发送回服务器,服务器可以使用该令牌验证用户身份,从而实现持续的用户会话。
  2. 记住用户首选项:例如,网站可以使用Cookie来记住用户的语言偏好、主题偏好或其他个性化设置,以便在用户下次访问时提供一致的用户体验。
  3. 购物车管理:在线购物网站通常使用Cookie来存储用户的购物车内容。当用户添加商品到购物车时,服务器可以将购物车数据存储在Cookie中,并在用户浏览不同页面或关闭浏览器后保持购物车状态。
  4. 广告跟踪和定向广告:广告商可以使用Cookie来跟踪用户的浏览行为,并根据用户的兴趣和偏好提供定向广告。这种技术称为行为定向广告。
  5. 跨站点数据传递:在一些情况下,Cookie可以用于在不同的域之间传递数据。例如,如果一个网站包含来自多个不同域的内容(如广告、社交媒体插件等),Cookie可以用于在这些域之间共享数据,以提供一致的用户体验。

Cookie的使用

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie
        Cookie cookie1 =new Cookie("c1","c1_message");
        Cookie cookie2 =new Cookie("c2","c2_message");
        // 将cookie放入响应对象
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求中的cookie
        Cookie[] cookies = request.getCookies();
        //迭代cookies数组
        if (null != cookies && cookies.length!= 0) {
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName()+":"+cookie.getValue());
            }
        }
    }
}

Cookie的时效性

Cookie有两种时效性:会话级Cookie和持久化Cookie。

  • 会话级Cookie在浏览器内存中存储,在浏览器未关闭时一直存在。浏览器关闭,内存中的Cookie数据就会被释放。
  • 持久化Cookie会被保存到硬盘上,在指定的时间内持续存在,即使浏览器关闭也不会消失。通过设置setMaxAge()方法可以控制Cookie的持久化时间,单位为秒,设置为0表示删除该Cookie。例子:cookie1.setMaxAge(60)。

Cookie的提交路径

设置Cookie的路径是一种控制哪些请求会携带该Cookie的方法。

通过setPath(String path)方法,可以指定Cookie的有效路径。只有在与指定路径匹配的请求中,浏览器才会发送该Cookie。这样可以确保Cookie只在特定路径下传输,提高了安全性和灵活性。

例子:cookie1.setPath("wuhan/servletB");

Session

HttpSession概述

HttpSession是一种在服务器端保留更多信息的技术,它为每个客户端(浏览器)在服务器端创建一个唯一的session对象,用于跟踪客户端的状态信息。当客户端发送请求时,可以使用自己的session来与服务器进行交互,服务器可以通过session来记录特定客户端的状态。

在创建session时,服务器会生成一个唯一的标识符,通常称为JSESSIONID,并将其以Cookie的形式随着响应一起发送给客户端。客户端收到JSESSIONID后,在下一次请求时会将其携带上去,服务器收到后根据JSESSIONID找到对应的session对象。通过这种机制,服务器可以存储针对特定客户端的信息,实现了客户端状态的跟踪和管理。

需要注意的是,session也是域对象,这意味着可以在其中存储各种类型的数据,并在整个会话期间共享和访问这些数据。

HttpSession的应用场景包括但不限于以下几个方面:

  1. 用户认证和授权管理: 在Web应用中,可以使用HttpSession来跟踪用户的登录状态和权限。一旦用户登录成功,可以将其身份信息存储在session中,以便在用户与服务器之间的交互中验证用户身份和权限。
  2. 购物车功能: 在电子商务网站中,可以使用HttpSession来实现购物车功能。当用户在网站上浏览商品并将其添加到购物车时,可以将商品信息存储在session中。这样,在用户在购物过程中可以随时查看购物车中的商品,并进行添加、删除或修改操作。
  3. 表单数据暂存: 当用户在填写表单时,如果需要暂时保存用户输入的数据以防止意外关闭页面或者重新加载页面导致数据丢失,可以使用HttpSession来存储表单数据。用户提交表单后,可以从session中获取之前输入的数据进行处理。
  4. 用户会话管理: HttpSession可以用于管理用户的会话状态。可以在session中存储一些用户偏好设置、浏览历史等信息,以提供个性化的用户体验。
  5. 缓存数据: 可以将一些频繁使用或者计算成本较高的数据存储在HttpSession中,以减少对数据库或者其他外部资源的访问,提高系统性能。
  6. 跨页面数据传递: 在多个页面之间传递数据时,可以使用HttpSession来暂存数据,以实现数据共享和传递。

HttpSession的使用

可以按照以下步骤使用HttpSession:

  1. 用户提交表单到ServletA,并携带用户名。
  2. ServletA获取到用户名,并将其存储到HttpSession中。
  3. 用户请求其他任意Servlet时,可以从HttpSession中获取之前存储的用户名。
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>学习JavaWeb</title>
    <link rel="stylesheet" href="static/css/login.css">
</head>
<body>
<form action="servletA" method="post">
    用户名:
    <input type="text" name="username">
    <input type="submit" value="提交">
</form>
</body>
</html>
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;

import java.io.IOException;

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取用户名
        String username = request.getParameter("username");

        // 获取当前会话的HttpSession对象
        HttpSession session = request.getSession();

        // 将用户名存储到HttpSession中
        session.setAttribute("username", username);
    }
}
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取当前会话的HttpSession对象
        HttpSession session = request.getSession();

        // 从HttpSession中获取之前存储的用户名
        String username = (String) session.getAttribute("username");

        // 输出到页面
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("用户名: " + username);
    }
}

getSession方法的处理逻辑

HttpSession时效性

设置会话(Session)的时效有几个主要原因:

  1. 释放服务器资源:每个会话都需要在服务器端存储一定量的信息,包括会话数据和状态信息。如果会话长时间保持活动状态而不被释放,会导致服务器的内存资源持续占用,最终可能导致服务器内存不足或性能下降。通过设置会话时效,可以确保会话在一定时间内自动过期并释放服务器资源。
  2. 安全性:如果会话长时间保持活动状态,那么在该会话中存储的敏感信息可能会被不法分子利用。设置会话时效可以减少敏感信息被窃取的风险,即使会话被窃取,也能够在一定时间后自动过期。
  3. 用户体验:某些情况下,用户可能会长时间保持会话活动状态而不进行任何操作,这可能导致资源的浪费。设置会话时效可以确保即使用户长时间不活动,也能够释放会话并节省服务器资源。

通过设置会话的时效,可以平衡服务器资源的利用和安全性,并提供更好的用户体验。通常,会话的时效可以根据应用程序的需求和安全策略进行配置,例如设置会话超时时间为30分钟或1小时等。

1、默认的session最大闲置时间(两次使用同一个session中的间隔时间) 在tomcat/conf/web.xml配置为30分钟。

2、也可以自己在当前项目的web.xml对最大闲置时间进行重新设定

3、也可以通过HttpSession的API 对最大闲置时间进行设定,通过调用 setMaxInactiveInterval(int interval) 方法,可以设置会话的最大闲置时间,单位为秒。超过这个时间,如果会话没有被活动访问,会话将被自动失效并释放资源。

// 设置最大闲置时间为60秒
session.setMaxInactiveInterval(60);

4、也可以直接让会话失效:通过调用 invalidate() 方法,可以立即使会话失效并释放相关资源。这在某些特定的场景下可能会有用,例如用户注销、会话过期或其他需要立即终止会话的情况。

// 直接让会话失效
session.invalidate();

cookie和session结合使用

在Web开发中,两种主要的存储方式是:服务端存储和客户端存储。

服务端存储(Server-side session):

  • 在服务端存储方式中,会话数据被保存在服务器的内存、数据库或者其他持久化存储中。客户端的Cookie中存储了一个会话标识符(session_id),而具体的数据则由服务器管理。
  • 当用户访问网站时,服务器会验证客户端提交的session_id,并从服务器端的存储中获取对应的会话数据,从而实现用户身份验证和状态管理。

客户端存储(Client-side session):

  • 在客户端存储方式中,会话数据被加密或序列化后存储在客户端的Cookie中,而不是存储在服务器端。
  • 客户端在每次请求时会将加密后的会话数据发送给服务器,服务器端根据客户端提交的数据进行解密或反序列化,从而获取会话信息。

不同的存储方式各有优缺点:

  • 服务端存储方式相对更安全,因为会话数据存储在服务器端,客户端无法直接访问和修改。
  • 客户端存储方式则更加灵活,可以减轻服务器的负担,但需要考虑数据安全性和加密算法的选择。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员老李头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值