日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

责任链模式以及应用场景

發布時間:2024/1/1 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 责任链模式以及应用场景 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

責任鏈模式應用

責任鏈模式(Chain of Responsibility Pattern)為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬于行為型模式。

在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。

應用場景

用戶登錄分為用戶名密碼登錄和手機驗證碼登錄,兩種登錄模式分別需要進行不同的信息校驗;例如用戶名密碼登錄需要進行用戶是否存在、用戶是否被鎖定、密碼校驗等校驗。手機驗證碼登錄需要進行用戶是否存在、驗證碼是否為空、驗證碼是否正確、用戶是否鎖定、用戶是否被禁用等校驗;責任鏈的另一個應用場景:SpringSecurity對請求過濾 FilterChainProxy

責任鏈處理類

責任鏈之前傳遞數據類

public class UserWrapper {/*** 數據庫用戶實體*/private AuthUser user;/*** 用戶登錄參數*/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;}/*** 執行處理方法** @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())) {/*** 獲取輸入錯誤驗證碼次數,如果大于3次,需要返回給前端錯誤次數過多,請求圖片驗證碼*/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);}}/*** 短信驗證碼正確,繼續執行后面的處理*/return getNextFilter() == null ? true : getNextFilter().process(userWrapper);} }

責任鏈調用

手機驗證碼登錄處理邏輯

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){// 登錄成功處理邏輯 }

?

總結

以上是生活随笔為你收集整理的责任链模式以及应用场景的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。