首页 > 其他分享 >HttpSession和Cookie的管理对于维持用户会话

HttpSession和Cookie的管理对于维持用户会话

时间:2024-10-31 11:34:37浏览次数:7  
标签:持久 会话 session Cookie 设置 cookie HttpSession

1. HttpSession生命周期

HttpSession用于在服务器端维持用户会话,从首次访问网站开始创建,通过唯一的Session ID标识。
会话生命周期通常由用户活动(如页面刷新、导航)延续,超时或注销后会话销毁。
默认情况下,会话在设定的时间无活动后超时,但可以通过Cookie持久化,实现跨页面、跨浏览器会话。

2. Cookie生命周期与作用

会话Cookie:在浏览器关闭后失效,适合临时会话数据。
持久Cookie:通过设置Max-Age或Expires实现,即使关闭浏览器也能保存,用于跨会话保持(如“记住我”功能)。
Cookie的生存时间应根据应用需求和安全性要求合理设置。

3. Cookie路径设置

全局路径 (cookie.setPath("/")):在整个应用中有效,适合全局会话和跨路径数据共享。
特定路径(如cookie.setPath("/ss")):仅在特定路径及其子路径有效,用于特定模块的会话控制。
通过设置路径,可以限制Cookie在指定范围传递,提高安全性并减少不必要的会话传递。

4. 页面生命周期与会话关系

页面生命周期是指页面从打开、操作到关闭的过程,与会话和Cookie协同工作。
使用会话级Cookie时,页面关闭后会话失效;持久Cookie则可以实现会话跨页面和跨浏览器的保持。

总结

通过结合HttpSession和Cookie的生命周期管理、路径设置和持久化配置,Web应用可以有效控制会话的范围、持续时间和安全性。灵活设置这些属性,不仅能确保用户体验一致,还可以降低安全风险,保障敏感数据在正确的路径范围和时间范围内访问。
设置持久Cookie的方式通常是在服务器端代码中配置Cookie的有效期。以下是如何设置持久Cookie的方法,以确保用户会话在关闭浏览器后依然有效。

具体代码示例

1. 在Java中设置持久Cookie

以Spring框架为例,可以在HttpServletResponse中设置Cookie的最大生存时间(Max-Age)来实现持久Cookie:


import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

public void createPersistentSessionCookie(HttpServletResponse response, String sessionId) {
    Cookie cookie = new Cookie("JSESSIONID", sessionId); // 使用Session ID
    cookie.setMaxAge(60 * 60 * 24 * 7); // 设置Cookie的存活时间为7天(以秒为单位)
    cookie.setPath("/"); // 设置路径,确保Cookie在整个应用中有效
    response.addCookie(cookie); // 将Cookie添加到响应中
}
这样一来,JSESSIONID就会被保存为持久Cookie,即使关闭浏览器重新打开,只要在7天有效期内,Session仍然有效。

2. 在Spring Boot中的应用

Spring Boot默认情况下将JSESSIONID设置为会话级Cookie,即关闭浏览器后会失效。如果需要设置成持久Cookie,可以通过配置文件或自定义Cookie设置:

使用配置文件

可以在application.properties或application.yml中配置

server.servlet.session.cookie.max-age参数,以设置全局的Cookie持久性:
server.servlet.session.cookie.max-age=604800 // 7天,单位为秒

自定义配置

在Spring Boot中,还可以通过自定义配置来设置持久Cookie:

复制代码
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SessionConfig {
    @Bean
    public Session.Cookie cookieCustomizer() {
        return cookie -> cookie.setMaxAge(60 * 60 * 24 * 7); // 7天的持久Cookie
    }
}

3. 在前端使用JavaScript设置持久Cookie

如果是需要在前端设置自定义Cookie,也可以使用JavaScript来设置一个持久的Cookie:

document.cookie = "mySessionId=your_session_id; max-age=" + 60 * 60 * 24 * 7 + "; path=/";

简单后端代码api示例

package com.example.demo.auth.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;

/**
 * @Author: da.han
 * @CreateTime: 2024-10-31
 * @Description:
 * @Version: 1.0
 */
@RestController
@RequestMapping("/session")
public class SessionAuthController {
    @PostMapping("/login")
    public String login(HttpServletRequest request, @RequestParam String username, @RequestParam String password) {
        if ("admin".equals(username) && "password".equals(password)) {
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            return "Login successful";
        }
        return "Invalid credentials";
    }

    @GetMapping("/resource")
    public String getResource(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute("username") != null) {
            return "Protected resource accessed!";
        }
        return "Unauthorized access";
    }

    @PostMapping("/logout")
    public String logout(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
        return "Logged out";
    }
}

标签:持久,会话,session,Cookie,设置,cookie,HttpSession
From: https://www.cnblogs.com/feniba/p/18517355

相关文章

  • C10-09-XSS之获取键盘记录、盲打获取cookie及克隆网站和文件上传绕过练习
    免责声明本文仅是个人对XSS和文件上传绕过及相关工具的学习测试过程记录,不具有恶意引导意向。一使用pikachu平台练习XSS键盘记录以dvwa-Low靶场为目标网站,通过dvwa的存储型XSS上传JS,验证pikachu工具对dvwa靶场页面键盘操作的记录1.1调试pikachu环境①调整Pikac......
  • 新工具可绕过 Google Chrome 的新 Cookie 加密系统
    一位研究人员发布了一款工具,用于绕过Google新推出的App-Bound加密cookie盗窃防御措施并从Chrome网络浏览器中提取已保存的凭据。这款工具名为“Chrome-App-Bound-Encryption-Decryption”,由网络安全研究员亚历山大·哈格纳(AlexanderHagenah)发布,因为他注意到其他......
  • Flutter中使用Cookies
    CookieCookie是一种在用户的浏览器中存储的小型文本文件,用于保存有关用户和他们的访问信息。它们通常用于以下目的:主要功能会话管理:保持用户登录状态,例如识别已登录的用户。个性化设置:保存用户的偏好设置,如语言、主题等。跟踪和分析:跟踪用户的行为,以便进行分析和广告投放......
  • 三周精通FastAPI:10 Cookie 参数 和Cookie 参数模型
    官方文档:Cookie参数-FastAPICookie参数¶定义 Cookie 参数与定义 Query 和 Path 参数一样。源码:fromtypingimportAnnotatedfromfastapiimportCookie,FastAPIapp=FastAPI()@app.get("/items/")asyncdefread_items(ads_id:Annotated[str|Non......
  • MVC架构 & Cookie
    MVC架构CookieCookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。发送Cookie创建Cookie对象,并设置数据Cookiecookie=newCookie("key","value");发送Cookie到客户端:使用response对象response.addCookie(cookie);3.2获取Cookie......
  • 关于node中cookie的相关研究
    在请求头中加入set-cookie字段,客户端收到这个Set-Cookie的ֽ应后,在之后的请求时会在Cookie中上这个值。一般格式可以参考如下Set-Cookie:token=dywuh1g87;Expires=Wed,11Aug202407:28:00GMT;Secure;HttpOnly了解一下cookie解释一下常用的几个属性Expires这......
  • session和cookie的区别
    本文将探讨Session和Cookie两种Web开发中常用的技术之间的区别。Session和Cookie都用于在Web应用程序中跟踪用户的状态和信息,但它们在实现和使用方面存在明显的差异。通过深入研究它们的特点,我们可以更好地理解何时选择哪种方法以满足特定的需求。1.数据存储位置Cookie:Cookie......
  • PbootCMS网站提示:”会话目录写入权限不足“
    当您遇到“会话目录写入权限不足”的提示时,通常是因为服务器上的某些目录缺少写入权限。根据您的描述,需要对根目录下的config、data和runtime目录进行权限设置。以下是详细的解决步骤:解决步骤检查文件夹权限:确保根目录下的config、data和runtime文件夹具有适当的写入权限。......
  • Cookie、Session、Token三者的区别
    在数字世界的茫茫人海中,每一次点击、每一次登录,都伴随着身份认证与数据安全的较量。今天咱要来一场惊心动魄的技术探秘之旅,今天我要带你深入探索Web开发中那三个绕不开的名字——Cookie、Session、Token,它们不仅仅是技术名词,更是构建安全、高效用户交互的基石,看看它们在接口鉴权、......
  • 会话管理-帮你搞懂cookie(Html版本)
    前端JavaScript中的cookie是一种用于在浏览器和服务器之间传递数据的机制。它们通常用于跟踪用户的会话信息,如登录状态、购物车内容等。Cookie的使用非常广泛,几乎所有的web应用程序都会使用到cookie来保存用户信息或者偏好设置‌。【注:dom和jdom的概念和转换看这篇-->】后端入......