Vue+elementui+JWT+AOP+回车键+token自动续期 实现登录功能-不完美地方就是每个方法都要加注解
功能介绍:登录成功后,用户页面1分钟无操作返回登录页面,包括新增等按钮效果:一、导包<!-- jwt jar 包--> <dependency>
功能介绍:登录成功后,用户页面1分钟无操作返回登录页面,包括新增等按钮
效果:
一、导包
<!-- jwt jar 包--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.6.0</version> </dependency> <!-- aop jar--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
二、
application.properties配置文件:
#用户 spring.datasource.username=root #密码 spring.datasource.password=123123 #连接是数据库 spring.datasource.url=jdbc:mysql://localhost:3306/jin1?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #打印Sql mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl #扫描.xml文件 mybatis-plus.mapper-locations=classpath*:xml/*.xml # Redis 服务器地址 spring.redis.host=localhost # Redis 服务器连接端? spring.redis.port=6379 # 连接池最大连接数(使用负值表示没有限制) 默认 8 spring.redis.lettuce.pool.max-active=100 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 spring.redis.lettuce.pool.max-wait=PT10S # 连接池中的最大空闲连接 默认 8 spring.redis.lettuce.pool.max-idle=30 # 连接池中的最小空闲连接 默认 0 spring.redis.lettuce.pool.min-idle=1 #链接超时时间 spring.redis.timeout=PT10S
三、定义登录的controller:
package com.kaigejava.controller;
import com.kaigejava.common.ResultCode;
import com.kaigejava.common.ResultObj;
import com.kaigejava.entity.User;
import com.kaigejava.service.UserService;
import com.kaigejava.util.JWTUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/login")
@CrossOrigin //跨域
public class LoginController {
@Autowired
private UserService userService;
private static final String ACCESS_TOKEN="ACCESS_TOKEN";
@Autowired
private RedisTemplate redisTemplate;
//登录
@PostMapping("login")
public ResultObj login(String username,String password) {
//判断用户名密码为空
if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
//ResultObj统一返回值
return ResultObj.error(ResultCode.USERNAME_PASSWORD_ISNULL);
}
//判断用户名是否存在
User user = userService.queryUserByUsername(username);
if (user == null) {
return ResultObj.error(ResultCode.USER_NOEXIST);
}
//判断密码是否正确
if (!password.equals(user.getPassword())) {
return ResultObj.error(ResultCode.PASSWORD_ERROR);
}
//登录成功,生成token
String token = JWTUtil.createToken(user);
//获取当前时间的毫秒值
String currentTime = String.valueOf(System.currentTimeMillis());
//拼接存到redis中的Key中
String accessKey=ACCESS_TOKEN+user.getId()+":"+token;
//往拼接存到redis中的Key存value值
redisTemplate.opsForValue().set(accessKey,currentTime);
//设置redis key的过期时间 2分钟
redisTemplate.expire(accessKey,2, TimeUnit.MINUTES);
return ResultObj.success(token);
}
}四、定义同意返回值类对象
package com.kaigejava.common;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultObj {
//状态码
private Integer code;
//信息
private String msg;
//数据
private Object data;
public static ResultObj success(Object data){
return new ResultObj(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMsg(),data);
}
public static ResultObj error(ResultCode resultCode){
return new ResultObj(resultCode.getCode(),resultCode.getMsg(),null);
}
}五、定义一个enum类:
package com.kaigejava.common;
public enum ResultCode {
SUCCESS(200,"操作成功"),
ERROR(500,"操作失败"),
USERNAME_PASSWORD_ISNULL(1001,"用户名或密码为空"),
USER_NOEXIST(1002,"用户不存在"),
PASSWORD_ERROR(1003,"密码错误"),
TOKEN_ERROR(1004,"登录失败")
;
private Integer code;
private String msg;
ResultCode(Integer code,String msg){
this.code=code;
this.msg=msg;
}
public Integer getCode(){
return code;
}
public void setCode(Integer code){
this.code=code;
}
public String getMsg(){
return msg;
}
public void setMsg(String msg){
this.msg=msg;
}
}六、定义一个切面类:
package com.kaigejava.common; import com.kaigejava.annotation.LoginAnnotation; import com.kaigejava.util.JWTUtil; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.http.H
原创不易,完成人机校验,阅读全文