SpringBoot2.x系列教程75--SpringBoot整合JPA、Redis实现分布式的Session共享

一.SpringBoot整合JPA、Redis实现分布式的Session共享

1. 创建web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。

2.添加依赖包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- 改造:添加sql相关的依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-core</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.39</version></dependency>

3.创建application.yml配置文件

server:port: 8080servlet:#设置session过期时间session:timeout: "PT10M"
spring:application:name: spring-session-jpadatasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: sycurl: jdbc:mysql://localhost:3306/spring-security?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&serverTimezone=UTCredis:host: localhostport: 6379database: 0jedis:pool:max-idle: 8min-idle: 0max-active: 8session:#设置session存储类型store-type: redisjpa:database: mysqlshow-sql: true #开发阶段,打印要执行的sql语句.hibernate:ddl-auto: update

4.创建User实体类

package com.yyg.boot.entity;import ch.qos.logback.classic.db.names.TableName;
import lombok.Data;
import lombok.ToString;
import org.hibernate.annotations.GenericGenerator;import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;/*** @Author 一一哥Sun* @Date Created in 2020/4/29* @Description Description*/
@Entity
@Table(name="user")
@Data
@ToString
public class User implements Serializable {@Id@GeneratedValue(generator = "idGenerator",strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username")@NotBlank(message = "username can not be empty")private String username;@Column(name = "password")@NotBlank(message = "password can not be empty")private String password;}

5.创建UserRepository仓库类

package com.yyg.boot.repository;import com.yyg.boot.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;/*** @Author 一一哥Sun* @Date Created in 2020/4/29* @Description Description*/
public interface UserRepository extends JpaRepository<User,Long> {User findByUsername(String username);User findByUsernameAndPassword(String username,String password);}

6.创建Service实现类

6.1 创建UserService接口

package com.yyg.boot.service;import com.yyg.boot.entity.User;/*** @Author 一一哥Sun* @Date Created in 2020/4/29* @Description Description*/
public interface UserService {/*** save user*/User saveUser(User user);/*** find user by account*/User findByUsername(String username);/*** user login*/User login(String username, String password);}

6.2 创建UserServiceImpl实现类

package com.yyg.boot.service.impl;import com.yyg.boot.entity.User;
import com.yyg.boot.repository.UserRepository;
import com.yyg.boot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @Author 一一哥Sun* @Date Created in 2020/4/29* @Description Description*/
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserRepository userRepository;@Overridepublic User saveUser(User user) {return userRepository.save(user);}@Overridepublic User findByUsername(String username) {return userRepository.findByUsername(username);}@Overridepublic User login(String username, String password) {return userRepository.findByUsernameAndPassword(username, password);}}

7.创建UserController接口

package com.yyg.boot.web;import com.yyg.boot.entity.User;
import com.yyg.boot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpSession;/*** @Author 一一哥Sun* @Date Created in 2020/4/29* @Description Description*/
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;/*** save user*/@PostMapping(value = "/save")public User save(@RequestBody User user) {return userService.saveUser(user);}/*** find user by username*/@GetMapping(value = "/find/{username}")public User findUser(@PathVariable String username) {return userService.findByUsername(username);}/*** user login*/@GetMapping(value = "/login")public User login(String username, String password, HttpSession session) {User user = userService.login(username, password);if(user!=null){session.setAttribute(session.getId(),user);}return user;}@GetMapping(value = "/logout")public String logout(HttpSession session){session.removeAttribute(session.getId());return "user logout success";}}

8.添加拦截器,判断session是否有效

package com.yyg.boot.config;import com.alibaba.fastjson.JSON;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;/*** @Author 一一哥Sun* @Date Created in 2020/4/28* @Description 开启Redis Http Session*/
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class RedisHttpSessionConfiguration implements WebMvcConfigurer {/*** 添加过滤接口*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new SecurityInterceptor())//排除拦截.excludePathPatterns("/user/login").excludePathPatterns("/user/logout")//拦截路径.addPathPatterns("/**");}/*** 判断session是否为空,从而进行拦截放行*/@Configurationpublic class SecurityInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {HttpSession session = request.getSession();if (session.getAttribute(session.getId()) != null) {return true;}response.getWriter().write(JSON.toJSONString("please login first"));return false;}}}

9.创建入口类

package com.yyg.boot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @Author 一一哥Sun* @Date Created in 2020/4/28* @Description Description*/
@SpringBootApplication
public class SpringSessionJpaApplication {public static void main(String[] args){SpringApplication.run(SpringSessionJpaApplication.class,args);}}

10.完整项目结构

11.启动项目,进行测试

我们在未登录的情况下,直接根据用户名查询某个用户信息,会看到浏览器提示我们先要进行登录。

然后测试save接口,会发现也是提示先进行登录才可以。

此时我们进行登录,登录成功

然后我们再进行save或find接口的测试,会发现此时这些接口都已经可以正常访问了。

数据库中已经多了一个新的数据。

然后我们再退出登录

然后重新测试查询接口,会发现已经无法查询用户信息了,提示需要进行登录才可以。

再重新登录后,我们可以再启动8081这个新的进程,然后查询tom这个用户信息,会发现也查询到了tom的用户信息,说明我们已经实现了session的共享。

redis中也有了保存的session信息。

SpringBoot2.x系列教程75--SpringBoot整合JPA、Redis实现分布式的Session共享相关推荐

  1. springboot整合oracle_SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介

    SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介 作者:一一哥 一. 分布式事务简介 1. 什么是分布式事务 百度百科对分布式事务的解释如下: 分布式事务就是指事务的 ...

  2. springboot socket服务端_SpringBoot2.x系列教程81--SpringBoot中整合WebSockets

    SpringBoot2.x系列教程81--SpringBoot中整合WebSockets 作者:一一哥 一. WebSockets简介 1. 什么是WebSockets WebSocket是HTML5 ...

  3. exchange无法收发邮件_SpringBoot2.x系列教程69--SpringBoot中整合邮件发送

    SpringBoot2.x系列教程69--SpringBoot中整合邮件发送 作者:一一哥 注: 本文案例以QQ邮箱发送的实现为例! 一. 邮件发送概述 1. 概述 在Spring框架中提供了一个Ja ...

  4. channelfuture怎么拿到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾

    SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...

  5. exchange无法收发邮件_SpringBoot2.x系列教程69--SpringBoot中整合Mail实现邮件发送

    SpringBoot2.x系列教程69--SpringBoot中整合邮件发送 作者:一一哥 注: 本文案例以QQ邮箱发送的实现为例! 一. 邮件发送概述 1. 概述 在Spring框架中提供了一个Ja ...

  6. getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾

    SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...

  7. SpringBoot2.x系列教程38--整合JAX-RS之利用Jersey框架实现RESTful

    SpringBoot2.x系列教程38--整合JAX-RS之利用Jersey框架实现RESTful 作者:一一哥 一. JAX-RS与Jersey简介 1. JAX-RS简介 在Java EE 6 中 ...

  8. (二)SpringBoot 整合 JPA

    一.JPA简介 JPA(java persistence api)并不是一个框架,而是一组规范.Hibernate.TopLink.OpenJPA都实现了JPA规范,不过Hinernate最成功).所 ...

  9. Springboot整合JPA多数据源(Oracle+Mysql)

    Springboot整合JPA多数据源 1. Maven 2. 基本配置 2.1 DataSource 3. 多数据源配置 3.1 JpaConfigOracle 3.2 JpaConfigMysql ...

最新文章

  1. python 7-10梦想的度假胜地_7-8----7-10练习
  2. 一起谈.NET技术,.NET异步编程:IO完成端口与BeginRead
  3. 包含以下字段的 struct 怎么解决_S7-300/400进阶笔记4-2:STEP7的“结构”STRUCT数据类型的用法...
  4. Python基础-三次用户验证登录购买商品程序
  5. pll制作分频器_PLL学习过程记录
  6. mysql的游标处理_mysql 存储过程、游标及逐行处理的配合使用
  7. Leetcode每日一题:38.Count and Say(外观数列)
  8. 图论算法及其matlab实现_BLDC有感FOC算法理论及其STM32软硬件实现
  9. mysql的cost
  10. centos配置epel和remi源
  11. logisim设计CPU
  12. 无线Wifi密码之暴力破解篇(WPA)
  13. Js获取CheckBook被选中的值
  14. ffmpeg实现视频马赛克特效
  15. STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!
  16. Vivado HLS介绍及IP核的设计流程
  17. matlab中sumf,使用SUMIF函数根据日期区间统计的方法
  18. 性能测试实战(七):数据驱动
  19. 最新苹果审核被拒4.3解决方案总结(2020年7月)
  20. JavaScript学习笔记(一)

热门文章

  1. Spring Boot 2.x 基础教程: 快速入门
  2. 浅析Java语言中两种异常的差别
  3. dd写入虚拟软盘第一扇区而不截断
  4. SAP BusinessObjects PCE(私有云版)
  5. python怎么编写模拟交易_使用Django搭建一个基金模拟交易系统教程
  6. 爬虫与反爬虫之间的战争
  7. vueUpload图片上传
  8. 强大又具实用性的 GreenBrowser 表单填写和管理功能
  9. 键盘与鼠标的未来——QUMA
  10. 故障演练--使用 ChaosBlade 进行混沌实验