开业时网站可以做哪些活动吗,互联网大厂,app注册推广拉人,烟台开发区人才网官网文章目录 前言一、接口扩展1. LoginStorage2. LocalLoginStorage3. RedisLoginStorage4. 参数配置 二、登录相关接口改动1.登录接口2. 登录拦截器 总结 前言
前面分别介绍了本地Map和redis存储用户登录信息#xff0c;但是第二天我登录就出现问题了#xff0c;因为我Redis部… 文章目录 前言一、接口扩展1. LoginStorage2. LocalLoginStorage3. RedisLoginStorage4. 参数配置 二、登录相关接口改动1.登录接口2. 登录拦截器 总结 前言
前面分别介绍了本地Map和redis存储用户登录信息但是第二天我登录就出现问题了因为我Redis部署在虚拟机里面不可能每次都专门启动虚拟机来回替换代码也太麻烦这里我们根据配置参数来控制下将用户信息存储到哪里。 一、接口扩展 开放扩展,关闭修改。 1. LoginStorage
package org.example.springboot3.bigevent.login;/*** Create by zjg on 2024/6/3*/
public interface LoginStorage {public void put(String id, String token);public String get(String id);public boolean remove(String id);
}2. LocalLoginStorage
package org.example.springboot3.bigevent.login;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** Create by zjg on 2024/6/3*/
ConditionalOnProperty(namelogin.storage,havingValue 0)
Component
public class LocalLoginStorage implements LoginStorage{private MapString,String loginUsersnew ConcurrentHashMap(256);Overridepublic void put(String id, String token) {loginUsers.put(id, token);}Overridepublic String get(String id) {return loginUsers.get(id);}Overridepublic boolean remove(String id) {return loginUsers.remove(id)!null;}}
3. RedisLoginStorage
package org.example.springboot3.bigevent.login;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;/*** Create by zjg on 2024/6/3*/
ConditionalOnProperty(namelogin.storage,havingValue 1)
Component
public class RedisLoginStorage implements LoginStorage{AutowiredStringRedisTemplate stringRedisTemplate;Overridepublic void put(String id, String token) {stringRedisTemplate.opsForValue().set(id,token,24, TimeUnit.HOURS);}Overridepublic String get(String id) {return stringRedisTemplate.opsForValue().get(id);}Overridepublic boolean remove(String id) {return Boolean.TRUE.equals(stringRedisTemplate.delete(id));}
}
4. 参数配置 这个参数控制使用本地存储、还是redis存储这样扩展起来也方便。 login:storage: 0二、登录相关接口改动
1.登录接口
Autowired
LoginStorage loginStorage;
RequestMapping(login)
public Result login(Valid User loginUser){String message用户名/密码不正确;User user userSerivce.findUserByName(loginUser.getUsername());if(user!null){//用户存在if(user.getPassword().equals(Md5Util.getMD5String(loginUser.getPassword()))){//密码正确MapString,Object claimsnew HashMap();claims.put(userId,user.getId());claims.put(username,user.getUsername());String token JwtUtils.create(claims);loginStorage.put(user.getId().toString(),token);return Result.success(登录成功,token);}}return Result.error(message);
}2. 登录拦截器
Autowired
LoginStorage loginStorage;
Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token request.getHeader(Authorization);if(token!nulltoken.contains(Bearer)){String tokenStr token.substring(token.indexOf(Bearer) 7);boolean verify JwtUtils.verify(tokenStr);if(verify){//此处解析loginUsers,验证用户已登录MapString, Object claims JwtUtils.getClaims(tokenStr);if(tokenStr.equals(loginStorage.get(claims.get(userId).toString()))){ThreadLocalUtil.set(claims);//用户信息放置ThreadLocalreturn true;};}}response.setStatus(HttpStatus.UNAUTHORIZED.value());response.setContentType(application/json;charsetUTF-8);ObjectMapper objectMapper new ObjectMapper();objectMapper.writerFor(Result.class);String message objectMapper.writeValueAsString(Result.error(token验证失败,请重新获取token后重试!));response.getWriter().println(message);return false;
} 总结
回到顶部 这样我们就可以通过参数login.storage的修改灵活地调整用户登录信息的存储方式了。 后面的登出接口和修改密码接口也会涉及到模式的使用。