package com.mossle.user.service; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.annotation.Resource; import com.mossle.user.persistence.domain.AccountLockInfo; import com.mossle.user.persistence.domain.AccountLockLog; import com.mossle.user.persistence.manager.AccountInfoManager; import com.mossle.user.persistence.manager.AccountLockInfoManager; import com.mossle.user.persistence.manager.AccountLockLogManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; // 5分钟内连续输入5次错误密码就锁定 // 10分钟后自动解锁 @Service @Transactional public class AccountLockService { private static Logger logger = LoggerFactory .getLogger(AccountLockService.class); public static final int DEFAULT_THRESHOLD = 5; public static final int FIVE_MINUTES = 5; public static final int TEN_MINUTES = 10; private int threshold = DEFAULT_THRESHOLD; private AccountInfoManager accountInfoManager; private AccountLockInfoManager accountLockInfoManager; private AccountLockLogManager accountLockLogManager; public void addLockLog(String username, String application, Date logDate) { AccountLockLog accountLockLog = new AccountLockLog(); accountLockLog.setType(application); accountLockLog.setLockTime(logDate); accountLockLog.setUsername(username); accountLockLogManager.save(accountLockLog); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, -1 * FIVE_MINUTES); String logHql = "from AccountLockLog where type=? and username=? and lockTime<?"; List<AccountLockLog> accountLockLogs = accountLockLogManager.find( logHql, application, username, calendar.getTime()); if (accountLockLogs.size() > threshold) { calendar.setTime(logDate); calendar.add(Calendar.MINUTE, FIVE_MINUTES); AccountLockInfo accountLockInfo = new AccountLockInfo(); accountLockInfo.setType(application); accountLockInfo.setLockTime(logDate); accountLockInfo.setReleaseTime(calendar.getTime()); accountLockInfo.setUsername(username); accountLockInfoManager.save(accountLockInfo); } } public void unlock(String username, String application) { String logHql = "from AccountLockLog where type=? and username=?"; List<AccountLockLog> accountLockLogs = accountLockLogManager.find( logHql, application, username); accountLockLogManager.removeAll(accountLockLogs); String infoHql = "from AccountLockInfo where type=? and username=?"; List<AccountLockInfo> accountLockInfos = accountLockInfoManager.find( infoHql, application, username); accountLockInfoManager.removeAll(accountLockInfos); } public void doUnlock() throws Exception { logger.debug("do unlock start"); String hqlAccountLockInfo = "from AccountLockInfo where releaseTime<?"; List<AccountLockInfo> accountLockInfos = accountLockInfoManager.find( hqlAccountLockInfo, new Date()); for (AccountLockInfo accountLockInfo : accountLockInfos) { logger.info("unlock info : {}", accountLockInfo.getUsername()); accountLockInfoManager.remove(accountLockInfo); String hqlAccountLockLog = "from AccountLockLog where type=? and username=?"; List<AccountLockLog> accountLockLogs = accountLockLogManager.find( hqlAccountLockLog, accountLockInfo.getType(), accountLockInfo.getUsername()); accountLockLogManager.removeAll(accountLockLogs); } Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, -1 * FIVE_MINUTES); String hqlAccountLockLog = "from AccountLockLog where lockTime<?"; List<AccountLockLog> accountLockLogs = accountLockLogManager.find( hqlAccountLockLog, calendar.getTime()); for (AccountLockLog accountLockLog : accountLockLogs) { logger.info("unlock log : {}", accountLockLog.getUsername()); accountLockLogManager.remove(accountLockLog); } logger.debug("do unlock end"); } public void doClean() throws Exception { logger.info("do clean start"); List<AccountLockInfo> accountLockInfos = accountLockInfoManager .getAll(); for (AccountLockInfo accountLockInfo : accountLockInfos) { logger.info("unlock : {}", accountLockInfo.getUsername()); accountLockInfoManager.remove(accountLockInfo); } List<AccountLockLog> accountLockLogs = accountLockLogManager.getAll(); accountLockLogManager.removeAll(accountLockLogs); logger.info("do clean end"); } @Resource public void setAccountLockInfoManager( AccountLockInfoManager accountLockInfoManager) { this.accountLockInfoManager = accountLockInfoManager; } @Resource public void setAccountLockLogManager( AccountLockLogManager accountLockLogManager) { this.accountLockLogManager = accountLockLogManager; } @Resource public void setAccountInfoManager(AccountInfoManager accountInfoManager) { this.accountInfoManager = accountInfoManager; } }