首先创建一个springboot项目,导入相关依赖,主要是导入整合redis的包
spring-boot-starter-data-redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.14</version>
</dependency>
yml配置文件加入整合redis配置,我连接的是本地的redis,如果是部署在虚拟机上,就将本地地址修改为虚拟机的ip地址,密码没有设置就不配置,有就设置,选择的是0号数据库,redis会有多个数据库,默认是16个,从0开始,就是0到15号
redis:
host: 127.0.0.1
port: 6379
database: 0
# password: 123456
其他数据源配置不变,然后要实现登录,那就需要一个登录页面,还有登录后跳转的页面
登录页面就放一个表单即可,页面自己画一个表单即可,然后跳转到controller层方法,
然后通过用户名去访问数据库,访问后拿到一个用户对象,进行条件判断,密码经过了md5加密
然后要操作缓存,那就需要一个操作缓存的对象,在springdataredis中他提供了一个高度封装的
对像,redisTemplates,redis中有5种数据类型,通过这个对象去拿到对应数据类型的操作对象
这里我拿的是String类型的操作对象,opsForValue去操作String类型的缓存
在登录的时候需要将用户信息存入缓存中,设置一个key,我存入的是用户id,key也是用户id
不同的用户就是不同的id,在存入缓存之前需要进行判断,需要根据当前查询出对象的id去缓存中
获取,判断是否为null,如果为空,当前用户没有登录,然后将信息存入缓存
如果不为空,则提示信息,用户已登录,
dao层和service和service实现层用mybatisplus继承一下就行了,在对应的层上面加入注解
dao层加入 @Mapper service实现层: @service
@Autowired
private RedisTemplate redisTemplate;
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){
String password = employee.getPassword();
password= DigestUtils.md5DigestAsHex(password.getBytes());
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Employee::getUsername,employee.getUsername());
Employee emp = employeeService.getOne(queryWrapper);
if(emp==null){
return R.error("登录失败");
}
if(!emp.getPassword().equals(password)){
return R.error("登录失败");
}
if(emp.getStatus()==0){
return R.error("账号已禁用");
}
Object user = redisTemplate.opsForValue().get(String.valueOf(emp.getId()));
if(user!=null){
return R.error("用户已经登录");
}
request.getSession().setAttribute("employee",emp.getId());
redisTemplate.opsForValue().set(String.valueOf(emp.getId()),emp.getId());
return R.success(emp);
}
这样的话就是如果当前用户登录了,再去使用该用户去登录,就登录不进去,如果没有登录,就登录进去,将信息存入缓存中,也就是保证只能登录一个该用户,数据库随便创建一个user表,
给个id,用户名和密码,大概就是这样,就将信息存入缓存,每次登录都需要去缓存中获取信息进行判断,判断用户是否登录,就不能再次登录该用户,页面给出提示信息,没有登录过,就将信息存入缓存,返回正确信息