首页 > 编程知识 正文

spring管理session,Bean @session

时间:2023-05-04 22:34:54 阅读:32047 作者:701

Spring Session Redis实现了Session共享,Session前后分离,单点登录实现了Session共享的简单方案,可以作为笔记

另一方面,会话和Cookie 1.Session概述: Session和会话是web开发中的会话跟踪技术。

Session会话进程:用户打开浏览器时,表示从第一个请求开始到最终关闭浏览器为止的单个会话。

2.Cookie概述: Cookie是由服务生成并存储在客户端的消息载体。 此载体包含用于此用户访问此站点的会话状态消息,并且保存的会话将一直有效,除非Cookie被清空或禁用。

cookie进程:在用户第一次请求时,服务器生成cookie,将其封装在请求标头中,并作为响应发送到客户端。 当客户端保存它并且客户端再次发送相同的请求时,请求会携带cookie发送到服务端,服务器会跟踪会话。

3.Session和Cookie之间的差异(简要说明) Session存储在服务端,Cookie存储在客户端。 Session保存在服务端,关闭浏览器将导致会话一次(Session已过期),但保存的会话将一直有效,除非Cookie客户端为空或禁用。 (请注意,Cookie包含Session,并且所有会话都另存为Cookie。)

示例:

会话客户端

饼干

二、使用Session时出现的问题和场景1 .对于单个Tomcat,使用Session (单个Tomcat不会导致Session出现大问题) ) ) ) ) ) ) ) ) )。

2 .多个Tomcat时使用Session

出问题了吗? 有这样的问题。 TomcatB生成Session,并且在访问TomcatA时,TomcatA不知道TomcatB创建的Session,而是在直接获取域间问题或JsessionId后获取并返回null。

有很多解决办法。 会话粘合、会话复制、会话外部化存储(MySQL、MongoDB、Redis )。

快速入门Spring Session Redis前提: Tomcat不同,但共享Redis

pom.xml:

ependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter/artifact id/dependencydepencygrigritior artifactidoptionaltrue/optional/dependencydependencygroupidorg.spring framework.boot/实现groupidorg.spring Spring MVC的自动配置--dependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starid artifaact -提供使用Redis作为数据源的Spring Session的自动配置--dependencygroupidorg.spring framework.session/groupidartifactidspring-session -实现数据spring数据redis的自动配置--dependencygroupidorg.spring framework.boot/groupidartard

tId>spring-boot-starter-data-redis</artifactId> <exclusions> <!-- 去掉对 Lettuce 的依赖,因为 Spring Boot 优先使用 Lettuce 作为 Redis 客户端 --> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入 Jedis 的依赖,这样 Spring Boot 实现对 Jedis 的自动化配置 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>

application.properties

#redisspring.redis.host=127.0.0.1spring.redis.port=6379

拦截器:

/** * @author lanys * @Description: * @date 3/6/2021 上午9:34 */@Configurationpublic class WebSecurityConfig implements WebMvcConfigurer { //自定义拦截 @Bean public RedisSessionInterceptor redisSessionInterceptor(){ return new RedisSessionInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { // registry.addInterceptor(redisSessionInterceptor()) .addPathPatterns("/api/**") .excludePathPatterns("/api/user/login"); WebMvcConfigurer.super.addInterceptors(registry); }}

自定义拦截:

/** * @author lanys * @Description: * @date 3/6/2021 上午9:36 */public class RedisSessionInterceptor implements HandlerInterceptor { @Autowired private RedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); String id = session.getId(); Integer loginUserId1 = (Integer) session.getAttribute("loginUserId"); if (session.getAttribute("loginUserId")!=null){ try{ String loginUserId= (String) redisTemplate.opsForValue().get("loginUserId:"+loginUserId1); if (loginUserId!=null && loginUserId.equals(session.getId())){ return true; } }catch (Exception e){ e.printStackTrace(); } } response.getWriter().print( "用户未登录!"); return false; }}

LoginController:

/** * @author lanys * @Description: * @date 3/6/2021 上午9:46 */@RestController@RequestMapping(value = "/api/user")public class LoginController { @Autowired private RedisTemplate redisTemplate; @RequestMapping("/login") public String login(HttpServletRequest request, Integer account, Integer password) throws Exception { SysUser sysUser = new SysUser(); if ( sysUser.getAccount()==account && sysUser.getPassword()==password) { HttpSession session = request.getSession(); session.setAttribute("loginUserId", sysUser.getUserId()); redisTemplate.opsForValue().set("loginUserId:"+sysUser.getUserId(), session.getId()); return "登录成功"; } else { throw new Exception("账户名或密码错误!"); } } @RequestMapping(value = "/getUserInfo") public Object get(long userId) throws Exception { SysUser sysUser = new SysUser(); if ( sysUser.getUserId()==userId) { return "查询成功!:"+sysUser.getUserId(); } else { throw new Exception( "用户不存在!"); } }}

SysUser:

/** * @author lanys * @Description: * @date 3/6/2021 上午9:47 */@Datapublic class SysUser { private int UserId=123456; private int account=123; private int password=123;}

RedisSession:

/** * @author lanys * @Description: 开启自动化配置 Spring Session 使用 Redis 作为数据源 * maxInactiveIntervalInSeconds=30 30秒后过期 * @date 3/6/2021 上午11:07 */@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 30)@Configurationpublic class RedisSession { @Bean public static ConfigureRedisAction configureRedisAction(){ return ConfigureRedisAction.NO_OP; }}




30秒后,过期了,查询不到数据(修改时间 RedisSession 类)

总结

该只是例子,主要充当思想,遇到了知道该怎么解决,有什么方案,文章结合网上其他博主的文章充当自己笔记。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。