您的位置:

PHP Session管理

一、从Redis管理Session

1、什么是Redis?

Redis是一个开源的全内存的数据结构存储系统,可以使用作为数据库,缓存和消息中间件。Redis支持诸如字符串,哈希,列表,集合,带有升序或者降序的有序集合等数据结构。

2、Redis用于Session管理的原因是什么?

由于PHP的Session默认是使用文件储存的,当页面并发较高时会对服务器造成很大的压力,很容易导致服务器宕机。而使用Redis作为Session管理工具,可以提高服务器的性能,减少服务器崩溃的可能性。

3、如何将PHP的Session储存在Redis中?

    session_save_handler('redis');
    session_save_path('tcp://127.0.0.1:6379');
    session_start();

二、SpringBoot Session管理

1、什么是SpringBoot?

SpringBoot是一个基于Spring框架的快速开发脚手架,它用来构建单个通用的JVM应用程序,可以在最小的开发时间内轻松创建和运行Spring应用程序。

2、SpringBoot如何管理Session?

通过在SpringBoot项目中使用Spring Session模块可以管理Session。Spring Session是一个用于管理用户会话的框架,它支持绝大多数会话管理解决方案,如默认的基于Cookie的会话管理、Spring Session提供的基于Redis的会话管理、分布式会话管理。

3、如何使用SpringBoot管理Session?

    // 添加Spring Session依赖
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
        <version>2.2.2.RELEASE</version>
    </dependency>
    
    // 配置Redis连接信息
    @Configuration
    @EnableRedisHttpSession
    public class RedisSessionConfig {
        @Bean
        public LettuceConnectionFactory connectionFactory() {
            return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379));
        }
    }

三、Shiro Session管理

1、什么是Shiro?

Shiro是一个很好的Java安全框架,能为应用程序提供安全管理功能。它为应用程序的安全提供了一种简单和易于理解的编程接口,将多种安全服务组合在一起,包括授权、认证、加密、会话管理等。

2、Shiro如何管理Session?

Shiro提供了一个SessionManager接口,用于处理Session管理的创建、启动、停止、删除等操作。可以使用实现SessionDAO接口的数据库或者缓存来储存管理Session信息。

3、如何使用Shiro管理Session?

    // 配置Shiro的SessionManager
    @Bean
    public SessionManager sessionManager() {
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        sessionManager.setGlobalSessionTimeout(1800000);
        sessionManager.setSessionDAO(redisSessionDAO());
        sessionManager.setSessionFactory(sessionFactory());
        sessionManager.setDeleteInvalidSessions(true);
        return sessionManager;
    }
    
    // 配置RedisSessionDAO
    @Bean
    public RedisSessionDAO redisSessionDAO() {
        RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
        redisSessionDAO.setRedisManager(redisManager());
        return redisSessionDAO;
    }

四、Session管理方式

1、什么是Session?

Session是由服务器创建的用于保存服务器与客户端会话状态的一种机制。常用于保存用户的登录信息、用户在服务端的一些操作信息等。

2、Session管理方式有哪些?

通过Cookie、Session ID、隐藏字段、URL 重写等方式来管理Session。

3、Session管理方式有什么优缺点?

通过Cookie保存Session ID的方式,相对比较安全可靠,但受限于同源策略,不能跨域访问;通过URL重写的方式,能够实现跨域访问,但会暴露Session ID,存在安全风险。

五、多个服务部署时Session管理选取

1、多个服务部署时需要注意什么?

多个服务部署时,同一用户的请求有可能被分配到不同的服务中,这会导致Session数据的不一致。因此,在进行分布式部署时,需要保证Session数据的一致性。

2、Session复制管理和Session共享管理的区别是什么?

Session复制管理,可以将Session信息复制到各个服务中,使得各个服务之间拥有同样的Session数据。但是这种方式会带来一定的延迟;Session共享管理,则是集中维护Session数据,各服务只需要从集中的Session服务器中获取Session数据即可,从而避免了Session数据不一致、系统复杂化等问题。

3、如何实现Session共享管理?

常用的实现方式有:推荐使用Redis、使用zookeeper、使用Memcache等。

参考资料:

1.SpirngReference官网:https://docs.spring.io/spring-session/docs/current/reference/html5/

2.Redis官网:https://redis.io/

3.Shiro官网:https://shiro.apache.org/