本文主要是介绍使用单例模式,工厂模式,实现多种方法登录校验(账号密码登录,手机号验证码登录),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用单例模式,工厂模式,实现多种方法登录校验(账号密码登录,手机号验证码登录)
文章目录
- 使用单例模式,工厂模式,实现多种方法登录校验(账号密码登录,手机号验证码登录)
- 前言
- 一、LoginFactory类(使用两种常见的设计模式)
- 二、通用校验接口LoginStrategy
- 二、通用审批接口实现类
- 三、Controller
前言
借鉴使用单例模式,工厂模式,实现多种审批(购买审批,订单审批…)
一、LoginFactory类(使用两种常见的设计模式)
@Component
public class LoginFactory {private static Map<String, LoginStrategy> operationMap = new HashMap<>();@Autowiredpublic LoginFactory(List<LoginStrategy> loginStrategies) {for (LoginStrategy loginStrategy : loginStrategies) {operationMap.put(loginStrategy.type(), loginStrategy);}}/*** 获取对应的目标实现类** @param loginType* @return*/public LoginStrategy getOperation(String loginType) {LoginStrategy loginStrategy = operationMap.get(loginType);Optional.ofNullable(loginStrategy).orElseThrow(() -> new BizException("不支持的登录方式"));return loginStrategy;}
}
二、通用校验接口LoginStrategy
public interface LoginStrategy {String type();UserVO login(LoginDTO loginDTO);
}
二、通用审批接口实现类
/*** @description 用户名密码登录*/
@Component
public class NameLoginStrategy implements LoginStrategy {@Resourceprivate UserService userService;@Resourceprivate RedisUtil redisUtil;@Overridepublic UserVO login(LoginDTO loginDTO) {UserVO userVO = userService.selectOneByMap(loginDTO.getLoginName());Optional.ofNullable(userVO).orElseThrow(() -> new BizException("用户名或密码错误"));//解密String fromInput = RsaUtil.decode(loginDTO.getPassword());String fromDb = RsaUtil.decode(userVO.getPassword());if (!StrUtil.equals(fromInput, fromDb)) {throw new BizException("用户名或密码输入错误!");}if (ObjectUtil.equals(userVO.getIsFreeze(), 1)) {throw new BizException("当前账号已被冻结!");}//使用satoken权限校验框架StpUtil.login(userVO.getCode());String token = StpUtil.getTokenValue();userVO.setToken(token);redisUtil.set(token, JSONUtil.toJsonStr(userVO), 86400);return userVO;}@Overridepublic String type() {return "nameLogin";}
}
/*** @description 手机号验证码登录*/
@Component
public class PhoneLoginStrategy implements LoginStrategy {@Resourceprivate UserService userService;@Resourceprivate RedisUtil redisUtil;@Overridepublic UserVO login(LoginDTO loginDTO) {UserVO userVO = portalUserService.selectOneByMap(loginDTO.getPhone());Optional.ofNullable(portalUserVO).orElseThrow(() -> new BizException("该手机号未被注册"));if (ObjectUtil.equals(portalUserVO.getIsFreeze(), 1)) {throw new BizException("该手机号对应的账号已被冻结!");}//TODO 手机验证码验证//使用satoken权限校验框架StpUtil.login(userVO.getCode());String token = StpUtil.getTokenValue();userVO.setToken(token);redisUtil.set(token, JSONUtil.toJsonStr(userVO), 86400);return userVO;}@Overridepublic String type() {return "phoneLogin";}}
三、Controller
@Resourceprivate LoginFactory loginFactory;/*** 电话号码登录** @param loginDto* @return*/@PostMapping("/login")public UserVo login(@RequestBody LoginDTO loginDto) {return loginFactory.getLogin("phoneLogin").login(loginDto);}/*** 账号密码登录** @param loginDto* @return*/@PostMapping("/login")public UserVo login(@RequestBody LoginDTO loginDto) {return loginFactory.getLogin("nameLogin").login(loginDto);}
这篇关于使用单例模式,工厂模式,实现多种方法登录校验(账号密码登录,手机号验证码登录)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!