Spring boot + Redis单点登入SSO

本文介绍了如何使用Spring Boot结合Redis实现单点登录(SSO)功能。在多系统环境中,用户登录一次即可访问所有关联系统,无需重复登录。文中详细讲解了配置步骤,包括application.yml配置、实体类、DAO层、Service层、Controller层、Redis相关类以及Util工具类的设置,并提供了前端页面示例和实现效果。
摘要由CSDN通过智能技术生成

简介
单点登录SSO(Single Sign On)是在一个多系统共存的环境下,用户在一处登录之后,就不用在其他的系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里面使用的比较多,例如像阿里巴巴这样的网站,在万丈的背后是成百上千的子系统,用户一次操作或交易可能涉及到几个十几个子系统的协作,如果每个子系统都需要用户认证,会在无形中增加时间的耗费

结构图
在这里插入图片描述
application.yml

spring:
  redis:
    database: 0    #redis的默认数据库为0
    host: 139.224.245.96  #链接redis的ip
    port: 6379  #链接redis的端口号
    password:   #链接redis的密码 默认为空
    jedis:
      pool:
        max-total: 200    #链接redis的总数目
        max-active: 100  #链接redis的最大
        max-idle: 8      #最大的链接数量
        min-idle: 5     #最小的链接数量
  datasource:
    url: jdbc:mysql://139.224.245.96:3306/huibo?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
server:
  port: 8989

REDIS_KEY : uuuu


实体类user

package com.example.demo.pojo;

import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Data
@Entity
@Table(name = "user")
public class user {
   

    @Id
    @Column(name = "id",unique = true,nullable = false)
    private int id;

    private String name;

    private int password;

}

dao层

package com.example.demo.dao;

import com.example.demo.pojo.user;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserDao extends JpaRepository<user,Integer> {
   
    public user findByNameAndAndPassword(String username,int password);
}

service层

package com.example.demo.service;

import com.example.demo.dao.UserDao;
import com.example.demo.pojo.user;
import com.example.demo.redis.JedisDao;
import com.example.demo.util.CookieUtils;
import com.example.demo.util.JsonUtils;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@Service
public class UserService {
   

    @Autowired
    private UserDao userDao;

    @Autowired
    private JedisDao jedisDao;

    @Value("${REDIS_KEY}")
    private String REDIS_KEY;

    private Map<Integer,String> userInfo = new HashMap<>();

    public Object getall(){
   
        String s = RandomStringUtils.randomAlphabetic(10);
        if (jedisDao.getValue(s)!=null){
   
            return jedisDao.getValue(s);
        }else {
   
            List<user> userList= userDao.findAll();
            jedisDao.setValue(s, JsonUtils.objectToJson(userList));
            return userList;
        }
    }

    public user userlogin(HttpServletRequest request, HttpServletResponse response, user u){
   
        //先进行数据库查询一遍
        user us=userDao.findByNameAndAndPassword(u.getName(),u.getPassword());
        //判断us是否为空
        if(us==null){
   
            return null;
        }
        //定义新的token
        String token="user_"+ UUID.randomUUID().toString();
        //判断map中是否存在该id
        if(!ObjectUtils.isEmpty(userInfo.get(us.getId()))){
   
            //从map中获得redis中的key
            String oldToken=userInfo.get(us.getId());
            //删除redis中老的值
            jedisDao.delValue(oldToken);
        }
        //将新的的key保存到map中
        userInfo.put(us.getId(),token);
        //将信息存入redis
        jedisDao.setValue(token,JsonUtils.objectToJson(us));
        //设置redis信息过期时间
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值