目录
本地文件上传
接口文档
业务实现
登录优化
SpringBoot集成redis
实现令牌主动失效机制
多环境开发
本地文件上传
接口文档
业务实现
创建FileUploadController类并编写请求方法
@RestController
public class FileUploadController {
@PostMapping("/upload")
public Result<String> upload(MultipartFile file) throws IOException {
//把文件内容存储到本地磁盘中
String Filename = file.getOriginalFilename(); //自动获取文件名
//保证文件名唯一 防止被覆盖
String filename = UUID.randomUUID() + Filename.substring(Filename.lastIndexOf("."));
//文件传输
file.transferTo( new File("D:\\ck\\"+filename));
//返回
return Result.success("url访问地址……");
}
}
运行请求查看
查看目录 文件已传输成功
登录优化
令牌主动失效机制
- 登录成功后,给浏览器响应令牌的同时,把该令牌存储到redis中
- LoginInterceptor拦截器中,需要验证浏览器携带的令牌,并同时需要获取到redis中存储的与之相同的令牌
- 当用户修改密码成功后,删除redis中存储的旧令牌
SpringBoot集成redis
导入spring-boot-starter-data-redis起步依赖
<!-- redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在yml配置文件中, 配置redis连接信息
data:
redis:
host: localhost
port: 6379
调用API(StringRedisTemplate)完成字符串的存取操作
@SpringBootTest //如果在测试类上添加了这个注解,那么将来单元测试方法执行之前,会先初始化Spring容器
public class redis_test {
@Autowired
private StringRedisTemplate stringRedisTemplate; //注入StringRedisTemplate对象
@Test
public void testSet(){
//向redis中存储一个键值对
ValueOperations<String, String> Operations = stringRedisTemplate.opsForValue();
Operations.set("name","TiTi"); //存入
String o = Operations.get("name"); //获取
System.out.println(o);
}
}
实现令牌主动失效机制
修改login登录接口方法
@Autowired
private StringRedisTemplate stringRedisTemplate; //注入StringRedisTemplate对象
@PostMapping("login")
public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password){
//根据用户名查询用户
User loginUser = userService.findByUserName(username); //定义实例对象
//判断用户是否存在
if(loginUser == null){
return Result.error("用户名错误");
}
//判断密码是否正确,将传入的password参数转成密文,再和数据库中的密文进行判断是否相同
if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){
//登录成功
Map<String,Object> claims = new HashMap<>(); //定义map集合对象
claims.put("id",loginUser.getId()); //添加id
claims.put("username",loginUser.getUsername()); //添加用户名
//生成jwt
String token = JwtUtil.genToken(claims);
//把token存储到redis中
ValueOperations<String, String> Operations = stringRedisTemplate.opsForValue();
Operations.set(token,token,1, TimeUnit.HOURS); //(键,值,过期时间1小时)
return Result.success(token);
}
return Result.error("密码错误");
}
在拦截器中修改从redis中获取token
在更新密码方法中设置更新密码就删除掉redis中的token
多环境开发
SpringBoot提供的Profiles可以用来隔离应用程序配置的各个部分,并在特定环境下指定部分配置生效
三个横线用于分隔不同的配置环境
---
on-profile用于指定哪些配置属于哪个环境
spring:
config:
activate:
on-profile: 环境名称
active用于指定哪个环境生效
spring:
profiles:
active: 环境名称
通过多个文件分别配置不同环境的属性 文件的名字为 application-环境名称.yml 在application.yml中激活环境
application.yml文件指定激活文件
spring:
profiles:
active: dev
group:
"dev": devServer,devDB,devSelf
- 按照配置的类别,把配置信息配置到不同的配置文件中:application-分类名.yml
- 在application.yml中定义分组 :spring.profiles.group
- 在application.yml中激活分组 :spring.profiles.active