Session与Cookie

Session属性值

Session属性值是指在Web应用中,存储在服务器端Session对象中的特定数据。Session对象用于在多个页面之间保持和传递状态信息,它允许在Web应用程序的不同页面之间共享数据。

Session属性值可以是任何类型的数据,如字符串、整数、布尔值、对象等。这些值通过给Session对象设置属性来存储,并且可以通过相应的属性名称进行检索和访问。

例如,在Web应用程序中,可以使用Session对象来存储用户的登录状态、用户ID、购物车内容等信息。通过设置Session属性,可以在用户访问不同页面时保持这些信息的一致性,并在需要时进行读取和更新。

需要注意的是,Session属性值的生命周期与用户的会话相关。当用户关闭浏览器或会话过期时,存储在Session对象中的属性值将被清除。此外,由于Session数据存储在服务器端,因此相对于Cookie而言,Session属性值更加安全和可靠。

Cookie属性值

  1. Name:Cookie的名称。一旦创建,名称便不可更改,且一般不区分大小写。
  2. Value:该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码。
  3. Max-Age/Expires:这两个属性都用于设置Cookie的过期时间。Max-Age的单位为秒,表示多少秒之后失效。Expires则采用UTC或GMT格式,表示具体的过期日期和时间。如果不设置这两个属性,或者设为null,Cookie只在当前会话(session)有效,浏览器窗口一旦关闭,该Cookie就会被删除。如果Max-Age设置为0,则立刻失效。如果Max-Age设置为负数,则表示Cookie将在浏览器关闭的时候失效,浏览器不会对该Cookie做任何形式的存储,这种Cookie也被称为临时Cookie。
  4. Domain:可以访问该Cookie的域名。Domain参数必须以点(“.”)开始,如“.baidu.com”表示所有以baidu.com结尾的域名都可以访问该Cookie。
  5. Path:表示该Cookie对哪些路径有效。Path属性需要使用符号“/”结尾。
  6. Secure:该属性用于标记Cookie是否仅被使用安全协议传输。安全协议,如HTTPS。如果Secure属性被设置,那么Cookie只会被发送到使用HTTPS的页面,这样可以防止在传输过程中被窃取。
  7. HttpOnly:如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。

session与cookie的本质区别

  1. 保存位置:这是session与cookie最本质的区别。session保存在服务器端的内存中,而cookie则保存在客户端,通常是在浏览器中。
  2. 安全性:由于session保存在服务器端,因此相对较为安全。而cookie保存在客户端,可能会受到一些安全风险,例如被拦截或本地文件被访问等。
  3. 保存数据的大小:cookie的大小通常受到浏览器限制,一般来说大约是4K左右。而session在服务器端,其大小通常取决于服务器的内存大小,因此可以保存更多的数据。
  4. 生存周期:session的生存周期通常与用户的访问进程相关,当浏览器或进程关闭之后,session通常也就“消失”了。而cookie的生存周期则可以预先设置,可以是短暂的,也可以是长期的,甚至可以永久保存在本地文件中。
  5. 用途:session通常被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。而cookie则更多地被用于标识用户,它可以是长久的,用于用户跟踪和识别唯一用户。

Session与Cookie的处理流程

Session处理流程

  1. 客户端请求:用户通过浏览器向服务器发送HTTP请求。
  2. 创建Session:服务器接收到请求后,会检查是否存在与该客户端对应的Session。如果不存在,服务器会创建一个新的Session对象,并生成一个唯一的Session ID。
  3. 存储Session:服务器将Session对象存储在服务器端的内存或持久化存储中(如数据库),以Session ID作为键。
  4. 发送Session ID:服务器将Session ID通过响应头发送给客户端,通常是通过设置名为“Set-Cookie”的HTTP头部来实现的。
  5. 客户端保存Session ID:客户端(通常是浏览器)接收到响应后,将Session ID保存在本地,通常是存储在Cookies中。
  6. 后续请求:在后续的请求中,客户端会自动将保存的Session ID通过请求头发送给服务器。
  7. 服务器验证Session:服务器接收到请求后,会从请求头中提取Session ID,并使用该ID从存储中检索对应的Session对象。
  8. 处理请求:服务器使用Session对象中的信息来处理客户端的请求,然后生成响应并发送回客户端。

Cookie处理流程

  1. 设置Cookie:服务器可以在响应中通过“Set-Cookie”头部设置Cookie。这通常发生在用户执行了某些操作后,如登录或设置偏好。
  2. 客户端保存Cookie:客户端(浏览器)接收到响应后,会将Cookie保存在本地。
  3. 发送Cookie:在后续的请求中,客户端会自动将保存的Cookie通过请求头发送给服务器。这通常是在每次发送请求时都会发生的。
  4. 服务器读取Cookie:服务器接收到请求后,会从请求头中提取Cookie信息。
  5. 处理请求:服务器使用Cookie中的信息来处理客户端的请求。例如,服务器可以使用Cookie来识别用户或检索用户的个性化设置。
  6. 更新或删除Cookie:服务器可以在响应中更新或删除客户端的Cookie。更新通常是通过发送一个新的“Set-Cookie”头部来完成的,而删除则是通过设置Cookie的过期时间为过去的时间点来实现的。
    在使用session和cookie时,我们需要根据具体的应用场景和需求来合理选择。以下是一些建议,可以帮助我们合理地使用session和cookie:

如何合理的使用session和cookie

对于session:

  1. 存储敏感数据:session在服务器端存储数据,相对较为安全。因此,我们可以将一些敏感的数据(如用户身份验证信息)存储在session中,以防止被恶意用户窃取。

  2. 管理用户状态:session可以用来管理用户的会话状态,例如记录用户是否已登录、用户的权限等。通过在session中保存这些信息,我们可以在用户访问不同页面时保持状态的一致性。

  3. 控制会话过期时间:通过设置session的过期时间,我们可以控制用户会话的持续时间。例如,在用户长时间未进行操作时,我们可以使session过期,要求用户重新登录,以增加系统的安全性。

对于cookie:

  1. 标识用户:cookie可以用来标识和跟踪用户。通过给用户分配一个唯一的cookie值,我们可以在用户访问不同页面时识别出同一个用户,并提供个性化的服务。

  2. 存储非敏感数据:相对于session而言,cookie的安全性较低。因此,我们应该避免在cookie中存储敏感数据。相反,我们可以将一些非敏感的数据(如用户的偏好设置)存储在cookie中,以便在用户下次访问时提供更好的用户体验。

  3. 控制cookie的作用域和过期时间:通过设置cookie的作用域和过期时间,我们可以控制cookie的作用范围和生命周期。例如,我们可以将cookie的作用域限制在特定的子域名下,或者设置cookie的过期时间为会话级别,使其在浏览器关闭时自动删除。

需要注意的是,session和cookie并非互斥的选择,它们可以相互配合使用。例如,在使用session管理用户状态时,我们可以将session ID存储在cookie中,以便在用户访问不同页面时传递session信息。

最后,无论选择使用session还是cookie,我们都应该遵循最佳的安全实践,如对用户输入进行验证和过滤,使用HTTPS协议进行加密传输等,以确保数据的安全性和完整性。

代码使用方式

Java(Servlet)中设置和获取Session

在Java Servlet中,你可以通过HttpSession接口来管理session。

设置Session属性:

// 获取当前session,如果当前没有session,则创建一个新的session
HttpSession session = request.getSession();

// 设置session属性
session.setAttribute("key", "value");

获取Session属性:

// 获取当前session
HttpSession session = request.getSession(false); // 如果当前没有session,则返回null

// 获取session属性
String value = (String) session.getAttribute("key");

注意,在request.getSession()方法中传递true(或省略参数,默认为true)会强制创建一个新的session,如果当前不存在的话。传递false则不会创建新的session,而是返回现有的session或者null

Java(Servlet)中设置和获取Cookie

在Java Servlet中,你可以通过Cookie类来管理cookie。

设置Cookie:

// 创建一个新的cookie
Cookie cookie = new Cookie("key", "value");

// 可选:设置cookie的其他属性,如过期时间、路径等
cookie.setMaxAge(60 * 60 * 24); // 设置cookie的过期时间为1天
cookie.setPath("/"); // 设置cookie的路径

// 将cookie添加到响应中
response.addCookie(cookie);

获取Cookie:

// 从请求中获取所有的cookies
Cookie[] cookies = request.getCookies();

// 遍历cookies来找到我们感兴趣的cookie
if (cookies != null) {
    for (Cookie cookie : cookies) {
        if ("key".equals(cookie.getName())) {
            String value = cookie.getValue();
            // 使用cookie的值
            break;
        }
    }
}

JavaScript中设置和获取Cookie

在JavaScript中,你可以通过document.cookie来管理cookie。

设置Cookie:

document.cookie = "key=value; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/";

注意,在设置cookie时,你需要同时设置其他属性,如expires(过期时间)和path(路径),以确保cookie按你的预期工作。

获取Cookie:

function getCookie(name) {
    let cookieArr = document.cookie.split(";");
    for (let i = 0; i < cookieArr.length; i++) {
        let cookiePair = cookieArr[i].split("=");
        if (name == cookiePair[0].trim()) {
            return decodeURIComponent(cookiePair[1]);
        }
    }
    return null;
}

let value = getCookie("key");

在这个例子中,getCookie函数遍历所有的cookie,查找并返回指定名称的cookie的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

幽·

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

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

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

打赏作者

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

抵扣说明:

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

余额充值