赞
踩
1.1 安装redis
2.1 引入redis坐标
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
2.2 配置redis信息
2.3 使用redis
2.3.1 在controller登录接口中设置值,在更改密码中删除值
- package com.geji.controller;
-
- import com.geji.pojo.Result;
- import com.geji.pojo.User;
- import com.geji.service.UserService;
- import com.geji.utils.JwtUtil;
- import com.geji.utils.Md5Util;
- import com.geji.utils.ThreadLocalUtil;
- import jakarta.validation.constraints.Pattern;
- import org.hibernate.validator.constraints.URL;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.redis.core.StringRedisTemplate;
- import org.springframework.data.redis.core.ValueOperations;
- import org.springframework.util.StringUtils;
- import org.springframework.validation.annotation.Validated;
- import org.springframework.web.bind.annotation.*;
-
- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.TimeUnit;
-
- @RestController
- @RequestMapping("/user")
- @Validated
- public class UserController {
-
- @Autowired
- private UserService userService;
-
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
- @PostMapping("/register")
- public Result register(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {
-
- //查询用户
- User u = userService.findByUserName(username);
- if (u == null) {
- //没有占用
- //注册
- userService.register(username, password);
- return Result.success();
- } else {
- //占用
- return Result.error("用户名已被占用");
- }
- }
-
- @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("用户名错误");
- }
-
- //判断密码是否正确 loginUser对象中的password是密文
- if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {
- //登录成功
- Map<String, Object> claims = new HashMap<>();
- claims.put("id", loginUser.getId());
- claims.put("username", loginUser.getUsername());
- String token = JwtUtil.genToken(claims);
- //把token存储到redis中
- ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
- operations.set(token,token,1, TimeUnit.HOURS);
- return Result.success(token);
- }
- return Result.error("密码错误");
- }
-
- @GetMapping("/userInfo")
- public Result<User> userInfo() {
-
- Map<String, Object> map = ThreadLocalUtil.get();
- String username = (String) map.get("username");
- User user = userService.findByUserName(username);
- return Result.success(user);
- }
-
- @PutMapping("/update")
- public Result update(@RequestBody @Validated User user) {
- userService.update(user);
- return Result.success();
- }
-
- @PatchMapping("updateAvatar")
- public Result updateAvatar(@RequestParam @URL String avatarUrl) {
- userService.updateAvatar(avatarUrl);
- return Result.success();
- }
-
- @PatchMapping("/updatePwd")
- public Result updatePwd(@RequestBody Map<String, String> params,@RequestHeader("Authorization") String token) {
- //1.校验参数
- String oldPwd = params.get("old_pwd");
- String newPwd = params.get("new_pwd");
- String rePwd = params.get("re_pwd");
-
- if (!StringUtils.hasLength(oldPwd) || !StringUtils.hasLength(newPwd) || !StringUtils.hasLength(rePwd)) {
- return Result.error("缺少必要的参数");
- }
-
- //原密码是否正确
- //调用userService根据用户名拿到原密码,再和old_pwd比对
- Map<String,Object> map = ThreadLocalUtil.get();
- String username = (String) map.get("username");
- User loginUser = userService.findByUserName(username);
- if (!loginUser.getPassword().equals(Md5Util.getMD5String(oldPwd))){
- return Result.error("原密码填写不正确");
- }
-
- //newPwd和rePwd是否一样
- if (!rePwd.equals(newPwd)){
- return Result.error("两次填写的新密码不一样");
- }
-
- //2.调用service完成密码更新
- userService.updatePwd(newPwd);
-
- //删除redis中对应的token
- ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
- operations.getOperations().delete(token);
-
- return Result.success();
- }
- }
2.3.2 在拦截器中获取值,和用户携带的值对比,如果不存在就拦截
- package com.geji.interceptors;
-
- import com.geji.pojo.Result;
- import com.geji.utils.JwtUtil;
- import com.geji.utils.ThreadLocalUtil;
- import jakarta.servlet.http.HttpServletRequest;
- import jakarta.servlet.http.HttpServletResponse;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.redis.core.StringRedisTemplate;
- import org.springframework.data.redis.core.ValueOperations;
- import org.springframework.stereotype.Component;
- import org.springframework.web.servlet.HandlerInterceptor;
-
- import java.util.Map;
-
- @Component
- public class LoginInterceptor implements HandlerInterceptor {
-
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- //令牌验证
- String token = request.getHeader("Authorization");
- //验证token
- try{
- //从redis中获取相同的token
- ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
- String redisToken = operations.get(token);
- if (redisToken==null){
- //token已经失效了
- throw new RuntimeException();
- }
-
- Map<String,Object> claims= JwtUtil.parseToken(token);
-
- //把业务数据存储到ThreadLocal中
- ThreadLocalUtil.set(claims);
-
- return true;
- }catch (Exception e){
- response.setStatus(401);
- return false;
- }
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- //清空ThreadLocal中的数据
- ThreadLocalUtil.remove();
- }
-
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。