责任链模式以及应用场景
生活随笔
收集整理的這篇文章主要介紹了
责任链模式以及应用场景
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
責任鏈模式應(yīng)用
責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進行解耦。這種類型的設(shè)計模式屬于行為型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。
應(yīng)用場景
用戶登錄分為用戶名密碼登錄和手機驗證碼登錄,兩種登錄模式分別需要進行不同的信息校驗;例如用戶名密碼登錄需要進行用戶是否存在、用戶是否被鎖定、密碼校驗等校驗。手機驗證碼登錄需要進行用戶是否存在、驗證碼是否為空、驗證碼是否正確、用戶是否鎖定、用戶是否被禁用等校驗;責任鏈的另一個應(yīng)用場景:SpringSecurity對請求過濾 FilterChainProxy
責任鏈處理類
責任鏈之前傳遞數(shù)據(jù)類
public class UserWrapper {/*** 數(shù)據(jù)庫用戶實體*/private AuthUser user;/*** 用戶登錄參數(shù)*/private LoginBo loginBo;/*** redis操作實例*/private RedisTemplate redisTemplate;public UserWrapper() {}public UserWrapper(AuthUser user, LoginBo loginBo, RedisTemplate redisTemplate) {this.user = user;this.loginBo = loginBo;this.redisTemplate = redisTemplate;} }責任鏈抽象接口
public abstract class UserLoginCheckFilter {/*** 下一個處理類*/private UserLoginCheckFilter nextFilter;public UserLoginCheckFilter(UserLoginCheckFilter userLoginCheckFilter) {this.nextFilter = userLoginCheckFilter;}public UserLoginCheckFilter getNextFilt er() {return this.nextFilter;}/*** 執(zhí)行處理方法** @param userWrapper* @return*/public abstract boolean process(UserWrapper userWrapper); }用戶是否存在檢查處理類
public class NullUserCheckFilter extends UserLoginCheckFilter {public NullUserCheckFilter(UserLoginCheckFilter userLoginCheckFilter) {super(userLoginCheckFilter);}@Overridepublic UserLoginCheckFilter getNextFilter() {return super.getNextFilter();}/*** 判斷登錄用戶是否為空** @param userWrapper* @return*/@Overridepublic final boolean process(UserWrapper userWrapper) {if (null == userWrapper.getUser()) {throw new MixException(USER_NOT_EXIST);}return getNextFilter() == null ? true : getNextFilter().process(userWrapper);} }密碼校驗處理類
public class PasswordCheckFilter extends UserLoginCheckFilter {public PasswordCheckFilter(UserLoginCheckFilter userLoginCheckFilter) {super(userLoginCheckFilter);}@Overridepublic UserLoginCheckFilter getNextFilter() {return super.getNextFilter();}/*** 判斷密碼是否正確** @param userWrapper* @return*/@Overridepublic final boolean process(UserWrapper userWrapper) {try{if (!PasswordUtil.base64Equal(userWrapper.getLoginBo().getCredential(),userWrapper.getUser().getPassword(),userWrapper.getUser().getSalt())) {throw new MixException(BusinessErrorEnum.PASSWORD_ERROR);}}catch (IllegalArgumentException e){throw new MixException(BusinessErrorEnum.BASE64_PASSWORD_ERROR);}return getNextFilter() == null ? true : getNextFilter().process(userWrapper);} }驗證碼為空處理類
public class NullCodeCheckFilter extends UserLoginCheckFilter {public NullCodeCheckFilter(UserLoginCheckFilter userLoginCheckFilter) {super(userLoginCheckFilter);}@Overridepublic UserLoginCheckFilter getNextFilter() {return super.getNextFilter();}/*** 判斷短信驗證碼是否為空** @param userWrapper* @return*/@Overridepublic final boolean process(UserWrapper userWrapper) {String code = (String) userWrapper.getRedisTemplate().opsForValue().get(RedisConstant.AUTH_MESSAGE_CODE_KEY + userWrapper.getLoginBo().getLoginName());if (null == code) {throw new MixException(BusinessErrorEnum.MESSAGE_CODE_EXPIRE);}return getNextFilter() == null ? true : getNextFilter().process(userWrapper);} }短信驗證碼校驗處理類
public class ErrorCodeCheckFilter extends UserLoginCheckFilter {public ErrorCodeCheckFilter(UserLoginCheckFilter userLoginCheckFilter) {super(userLoginCheckFilter);}@Overridepublic UserLoginCheckFilter getNextFilter() {return super.getNextFilter();}/*** 判斷短信驗證碼是否錯誤** @param userWrapper* @return*/@Overridepublic final boolean process(UserWrapper userWrapper) {/*** 查詢短信code*/String code = (String) userWrapper.getRedisTemplate().opsForValue().get(RedisConstant.AUTH_MESSAGE_CODE_KEY + userWrapper.getLoginBo().getLoginName());/*** 判斷短信驗證碼是否匹配*/if (!code.equals(userWrapper.getLoginBo().getCredential())) {/*** 獲取輸入錯誤驗證碼次數(shù),如果大于3次,需要返回給前端錯誤次數(shù)過多,請求圖片驗證碼*/String key = RedisConstant.AUTH_MESSAGE_CODE_COUNT_KEY + userWrapper.getLoginBo().getLoginName();Integer errorCodeCount = (Integer) userWrapper.getRedisTemplate().opsForValue().get(key);if (null != errorCodeCount && errorCodeCount.intValue() >= RedisConstant.AUTH_MESSAGE_CODE_ERROR_COUNT) {throw new MixException(BusinessErrorEnum.ERROR_CODE_MANY);} else {throw new MixException(BusinessErrorEnum.MESSAGE_CODE_ERROR);}}/*** 短信驗證碼正確,繼續(xù)執(zhí)行后面的處理*/return getNextFilter() == null ? true : getNextFilter().process(userWrapper);} }責任鏈調(diào)用
手機驗證碼登錄處理邏輯
UserLoginCheckFilter userLoginCheckFilter = new NullUserCheckFilter(new NullCodeCheckFilter(new ErrorCodeCheckFilter(new LockedUserCheckFilter(new DisableUserCheckFilter(null))))); boolean loginResult = userLoginCheckFilter.process(new UserWrapper(user, loginBo, redisTemplate)); if(loginResult){// 登錄成功處理邏輯 }?
用戶名密碼登錄處理邏輯
UserLoginCheckFilter userLoginCheckFilter = new NullUserCheckFilter(new LockedUserCheckFilter(new DisableUserCheckFilter(new PasswordCheckFilter(null)))); boolean loginResult = userLoginCheckFilter.process(new UserWrapper(user, loginBo, redisTemplate)); if(loginResult){// 登錄成功處理邏輯 }?
總結(jié)
以上是生活随笔為你收集整理的责任链模式以及应用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Updating...门店零售业数据分析
- 下一篇: SETP7 Basic V11 SP1