首页 > 其他分享 >session

session

时间:2024-05-25 20:05:22浏览次数:20  
标签:存储 浏览器 Session 用户 session ID

什么是session

      Session是计算机科学中的一个概念,它用来追踪与某个用户的一系列交互。在网站开发中,session通常用于存储和管理用户在网站上的登录状态和其他相关信息。当用户登录网站时,系统会为该用户创建一个session,生成一个唯一的session ID,并将该ID存储在用户的浏览器cookie中。随后,用户在访问网站的过程中,会不断通过该session ID与服务器进行通信,服务器会根据session ID来识别用户并保存用户的状态。这样,在用户的一次访问过程中,可以通过session来跟踪和维护用户的状态和数据。

    通过session,网站可以实现一些功能,如用户登录验证、购物车功能、用户数据存储等。当用户关闭浏览器或超过一定时间没有操作,session会自动过期,用户的登录状态和其他相关信息也会被清除。

     需要注意的是,session的实现方式可能有所不同,如使用服务器端存储(如内存、数据库)或分布式存储(如Redis)等。此外,为了保护用户的隐私和安全,session ID应该采用随机且不可预测的方式生成,并使用HTTPS进行传输。

session原理

     Session是Web开发中的一个重要概念,用于跟踪用户在不同请求之间的状态。下面是对       Session原理:

  1. 当用户首次访问服务器时,服务器会为该用户创建一个Session对象,并为该Session对象生成一个唯一的标识符(通常称为Session ID)。
  2. 服务器会将Session ID以Cookie的形式发送给客户端浏览器,并命令浏览器保存该Cookie。
  3. 之后,客户端浏览器在每次发送请求时都会携带该Cookie,以便服务器能够识别用户。
  4. 当用户关闭浏览器或会话超时时,会话Cookie会被浏览器自动删除。下次再次访问时,浏览器不会携带会话Cookie,服务器会创建一个新的Session对象。
  5. Session数据存储在服务器的内存或持久化存储中(如数据库),通常以键值对的形式保存。Session ID用于在服务器端查找对应的Session对象,并将数据与该Session对象关联起来。

需要注意的是,Session是基于服务器端的机制,客户端浏览器只是负责保存Session ID。服务器通过Session ID来识别用户,从而实现用户状态的跟踪。

分布式下session的问题

      分布式下session的问题是指在集群环境中,由于不同的服务实例之间无法共享session数据而导致的一系列问题。

     其中一个常见的问题是session不同步。在集群环境中,多个服务实例之间会进行负载均衡,但当第一次负载均衡将请求发送到某个服务实例时,该实例会将session数据保存在自己的内存中。而当下一次负载均衡将请求发送到另一个服务实例时,该实例并没有之前保存的session数据,导致了session数据不同步的问题。

     为了解决这个问题,可以使用分布式session的方案,即将session数据存储到共享的中间件中,如Redis。每个服务实例都可以通过中间件获取、存储和更新session数据,从而实现session的同步。

    一个常见的解决方案是使用Spring Session。Spring Session提供了一套方便的API和机制,可以将session数据统一存储到Redis等中间件中。每个服务实例都可以通过Spring Session来访问共享的session数据,从而解决了session不同步的问题。

    另一个问题是子域session不共享的情况。当浏览器访问A服务时,A服务会生成一个包含JsessionId的cookie,并设置该cookie的作用域为A服务的域名(例如A.lcy.com)。然后,当跳转到B服务时,B服务的域名是不同的(例如B.lcy.com),因此浏览器并没有携带之前的JsessionId。

    为了解决这个问题,可以将session的作用域设置为父域(例如lcy.com),这样无论是A服务还是B服务,都可以在同一个父域下获取到同一个JsessionId。在将session存储到Redis等中间件时,需要将session的作用域也设置为父域,以便在不同的子域中共享session数据。

实例

  1. 在Spring Boot的配置文件(application.properties或application.yml)中设置 session 管理器的相关属性:

    server:
      servlet:
        session:
          timeout: 1800 # 设置 session 过期时间(单位:秒)
    

  2. 在一个Controller中,注入 javax.servlet.http.HttpServletRequest 对象,以便在处理请求时获取session对象:

    import javax.servlet.http.HttpServletRequest;
    // ...
    @Autowired
    private HttpServletRequest request;
    

  3. 使用session对象进行操作,例如存储和获取值。以下是一个简单的示例:

    // 存储值到session中
    request.getSession().setAttribute("key", "value");
    
    // 从session中获取值
    String value = (String) request.getSession().getAttribute("key");
    

  4. 可以在其他Controller或Service中重复步骤3来操作session。

需要注意的是,Spring Boot中的session是存储在内存中的,如果要使用分布式环境或者需要更高级的session管理功能,可以考虑使用第三方的session管理工具,例如Spring Session。

另外,还可以使用Spring Session提供的注解 @SessionAttributes 来简化操作session的过程。可以将需要存储在session中的数据使用注解 @SessionAttributes 标记在Controller类上,然后可以直接在方法的参数中声明需要获取的session属性,Spring会自动将session中的数据注入到方法中。示例代码如下:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@SessionAttributes("key") // 标记需要存储在session中的属性名
public class MyController {

    @GetMapping("/myPage")
    public String myPage(@ModelAttribute("key") String value) {
        // 使用session中的值
        System.out.println(value);
        return "myPage";
    }
}

在上面的例子中,@ModelAttribute("key") 注解表示从session中获取名为 "key" 的属性,并注入到 myPage 方法的参数中。

总结

     Session是一种用于存储和管理用户状态信息的技术。它用于跟踪每个用户与服务器之间的交互,并在需要时存储和检索用户数据。

以下是关于Java Session的一些总结:

  1. Session是在服务器端创建和维护的,用于存储每个用户的状态信息。每个用户都会被分配一个唯一的Session ID来标识他们的会话。

  2. Session可以在不同的请求之间保持数据的一致性。它允许在用户访问不同页面或操作时在会话期间共享和传递数据。

  3. Session可以存储任意类型的对象,包括基本数据类型、自定义对象和集合对象等。在Session中存储的数据将在用户的整个会话期间保持有效。

  4. Session可以用于实现用户身份验证和授权。通过在Session中存储用户的登录信息和权限,可以验证用户是否具有访问特定资源的权限。

  5. Session可以通过不同的机制实现,包括Cookie、URL重写和隐藏字段等。其中,Cookie是最常用的机制,它通过在客户端保存Session ID来跟踪用户的会话。

  6. Session的生命周期可以通过配置进行管理。可以设置Session的超时时间和最大活动时间等参数,以控制Session的有效期。

标签:存储,浏览器,Session,用户,session,ID
From: https://blog.csdn.net/Flying_Fish_roe/article/details/139043930

相关文章

  • SpringBoot设置Session失效时间
    springboot的yml文件中设置session的过期时间#Session超时时间设置,单位是秒,默认是30分钟servlet:session:timeout:3600s当过期时间是大于1分钟的时候是没有什么问题的,但是如果设置过期时间小于1分钟,就会失效。servlet:session:timeout:10......
  • token、cookie、session的区别
    token是验证用户身份的令牌,通常是用于接口的身份验证,一般获取之后放在请求头中cookie和session的区别:cookie是服务器发送到客户端然后存储在客户端的,可以用来保持用户的登录信息session是服务器为了方便存储用户会话信息产生的,客户端访问服务器时,服务器给每个访问对象创建一个......
  • spark的SparkContext,SparkConf和SparkSession及dataframe和RDD的区别
    spark的SparkContext,SparkConf和SparkSession及dataframe和RDD的区别SparkContext和SparkConf任何Spark程序都是SparkContext开始的,SparkContext的初始化需要一个SparkConf对象,SparkConf包含了Spark集群配置的各种参数。初始化后,就可以使用SparkContext对象所包含的各种方......
  • 后端跨域cookie问题与spring-session-data-redis
    背景1、后端统一接入了公司内部登录系统,登录后cookie信息在域名:test.net.cn下。Set-Cookie:SESSION=09a2f617-66a0-4e02-b99f-130d83900321;Domain=test.net.cn;Path=/;HttpOnly;SameSite=Lax2、当我们的系统接入到统一登录系统后,若访问域名为a.test.net.cn,则不会出现问题,因......
  • sqlSession相关的作用域和生命周期
    生命周期和作用域是十分重要的,错误的使用会导致非常严重的并发问题。Mybatis的执行流程详细讲解SqlSessionFactoryBuilder:一旦创建了SqlSessionFactory,就不需要它了,比较适合在局部变量中创建。SqlSessionFactory:相当于数据库的连接池;SqlSessionFactory一旦被创建就应......
  • Cookie和Session
    CookieCookie大小上限为4KB;一个服务器最多在客户端浏览器上保存20个Cookie;一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器。cookie设置的数据是明文存储在客户端的,不安全为了维护登录状态Http协议无状态:不会记录任何客户端和服务端的信息无连接(clo......
  • Session相关知识
    什么是Session当用户请求来自应用程序的Web页时,服务器会给每一个用户(浏览器)创建一个Session对象;用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去,默认情况下,只要浏览器没有关闭,这个Session就一直存在。Session的常用......
  • 配置session——缓存
    1、服务器+redis安装启动2、djangoa、安装链接redis包pipinstalldjango-redisb、settings.py```MIDDLEWARE=['django.contrib.sessions.middleware.SessionMiddleware',]#sessionSESSION_ENGINE='django.contrib.sessions.backends.cache'SESSION_CAC......
  • 配置session——数据库
    INSTALLED_APPS=[......'django.contrib.sessions',......]MIDDLEWARE=[......'django.middleware.common.CommonMiddleware',......]#sessionSESSION_ENGINE='django.contrib.sessions.backends.......
  • 配置session——文件版
    MIDDLEWARE=[......'django.contrib.sessions.middleware.SessionMiddleware',#中间件中会对session进行操作......]#sessionSESSION_ENGINE='django.contrib.sessions.backends.file'#配置session文件版SESSION_FILE_PATH=�......