简介
单点登录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信息过期时间