Skip to content

Commit e9cd5a7

Browse files
author
hdf
committedMar 27, 2019
登录错误次数bug
登录记录日志异步
1 parent 53db9d9 commit e9cd5a7

File tree

4 files changed

+64
-23
lines changed

4 files changed

+64
-23
lines changed
 

‎src/main/java/com/seezoon/admin/modules/sys/security/LoginResultHandler.java

+28-19
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.io.IOException;
44
import java.io.PrintWriter;
55
import java.util.HashMap;
6+
import java.util.concurrent.ExecutorService;
7+
import java.util.concurrent.Executors;
68

79
import javax.servlet.ServletException;
810
import javax.servlet.http.HttpServletRequest;
@@ -43,6 +45,7 @@ public class LoginResultHandler implements AuthenticationSuccessHandler,Authenti
4345
private LoginSecurityService loginSecurityService;
4446
@Autowired
4547
private SysLoginLogService sysLoginLogService;
48+
private ExecutorService threadPool = Executors.newCachedThreadPool();
4649
@Override
4750
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
4851
AuthenticationException exception) throws IOException, ServletException {
@@ -98,27 +101,33 @@ private void loginLog(String status,String loginName,HttpServletRequest request)
98101
String ip = IpUtils.getIpAddr(request);
99102
String userAgentStr = request.getHeader("User-Agent");
100103
UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
101-
Browser browser = userAgent.getBrowser();
102-
OperatingSystem os = userAgent.getOperatingSystem();
103-
String deviceName = os.getName() + " "+ os.getDeviceType();
104-
String area = "";
105-
String browserStr = browser.getName() +" "+ browser.getVersion(userAgentStr);
106-
try {
107-
if (StringUtils.isNotEmpty(ip)) {
108-
HashMap<String, String> params = Maps.newHashMap();
109-
params.put("ip",ip);
110-
String ipInfo = HttpRequestUtils.doGet("http://ip.taobao.com/service/getIpInfo.php",params);
111-
if (StringUtils.isNotEmpty(ipInfo)) {
112-
JSONObject parseObject = JSON.parseObject(ipInfo);
113-
if (parseObject.containsKey("data")) {
114-
JSONObject data = parseObject.getJSONObject("data");
115-
area = data.getString("region") + data.getString("city");
104+
threadPool.execute(new Runnable() {
105+
106+
@Override
107+
public void run() {
108+
Browser browser = userAgent.getBrowser();
109+
OperatingSystem os = userAgent.getOperatingSystem();
110+
String deviceName = os.getName() + " "+ os.getDeviceType();
111+
String area = "";
112+
String browserStr = browser.getName() +" "+ browser.getVersion(userAgentStr);
113+
try {
114+
if (StringUtils.isNotEmpty(ip)) {
115+
HashMap<String, String> params = Maps.newHashMap();
116+
params.put("ip",ip);
117+
String ipInfo = HttpRequestUtils.doGet("http://ip.taobao.com/service/getIpInfo.php",params);
118+
if (StringUtils.isNotEmpty(ipInfo)) {
119+
JSONObject parseObject = JSON.parseObject(ipInfo);
120+
if (parseObject.containsKey("data")) {
121+
JSONObject data = parseObject.getJSONObject("data");
122+
area = data.getString("region") + data.getString("city");
123+
}
124+
}
116125
}
126+
} catch (Exception e) {
127+
logger.error("userId login log get location fail ",e);
117128
}
129+
sysLoginLogService.loginLogByLoginName(SysLoginLog.SUCCESS, loginName, ip, userAgentStr, browserStr, deviceName, area);
118130
}
119-
} catch (Exception e) {
120-
logger.error("userId login log get location fail ",e);
121-
}
122-
sysLoginLogService.loginLogByLoginName(SysLoginLog.SUCCESS, loginName, ip, userAgentStr, browserStr, deviceName, area);
131+
});
123132
}
124133
}

‎src/main/java/com/seezoon/admin/modules/sys/service/LoginSecurityService.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,25 @@
88
import org.springframework.stereotype.Service;
99
import org.springframework.util.Assert;
1010

11+
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
1112
import com.seezoon.boot.common.service.BaseService;
1213

1314

1415
@Service
1516
public class LoginSecurityService extends BaseService {
1617

1718
@Resource(name="redisTemplate")
18-
private ValueOperations<String, Long> valueOperations;
19+
private ValueOperations<String, Integer> valueOperations;
1920
private String LOCK_PREFIX = "login_cnt_";
2021

2122
public void unLock(String loginName) {
2223
Assert.hasLength(loginName, "loginName 为空");
2324
valueOperations.getOperations().delete(LOCK_PREFIX + loginName);
2425
}
2526

26-
public Long getLoginFailCount(String loginName) {
27+
public Integer getLoginFailCount(String loginName) {
2728
try {
28-
Long cnt = valueOperations.get(LOCK_PREFIX + loginName);
29+
Integer cnt = valueOperations.get(LOCK_PREFIX + loginName);
2930
return null == cnt ? 0:cnt;
3031
} finally {
3132
valueOperations.getOperations().expire(LOCK_PREFIX + loginName, 24, TimeUnit.HOURS);
@@ -37,6 +38,9 @@ public boolean isLocked(String loginName) {
3738
}
3839
public Long incrementLoginFailTimes(String loginName) {
3940
try {
41+
//实际存放在redis 中是integer的,超过integer才会到long spring data increment
42+
//在GenericFastJsonRedisSerializer/GenericJackson2JsonRedisSerializer 下的bug
43+
//测试RedisAtomicLong 也会有类型问题,为了改动小故采用integer 正确使用是通过increment 获取值,而不是直接get
4044
Long increment = valueOperations.increment(LOCK_PREFIX + loginName, 1);
4145
return increment;
4246
} finally {

‎src/test/java/com/seezoon/boot/redis/RedisTest.java

+28
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.springframework.core.env.Environment;
88
import org.springframework.data.redis.core.RedisTemplate;
99
import org.springframework.data.redis.core.ValueOperations;
10+
import org.springframework.data.redis.serializer.StringRedisSerializer;
11+
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
1012

1113
import com.seezoon.boot.BaseApplicationTest;
1214
import com.seezoon.boot.context.dto.AdminUser;
@@ -19,6 +21,32 @@ public class RedisTest extends BaseApplicationTest{
1921
ValueOperations<String, AdminUser> valueOperations;
2022
@Autowired
2123
private Environment environment;
24+
25+
@Resource(name="redisTemplate")
26+
private ValueOperations<String, Long> longValueOperations;
27+
@Resource(name="redisTemplate")
28+
private ValueOperations<String, Long> long1ValueOperations;
29+
30+
@Test
31+
public void redisAtomicLong() {
32+
RedisAtomicLong redisAtomicLong = new RedisAtomicLong("cnt", long1ValueOperations.getOperations());
33+
}
34+
@Test
35+
public void longSetTest() {
36+
long1ValueOperations.set("111", 1l);
37+
Long long1 = long1ValueOperations.get("111");
38+
System.out.println(long1);
39+
}
40+
@Test
41+
public void increment() {
42+
//Long increment = longValueOperations.increment("increment", 1);
43+
//redisTemplate.setValueSerializer(new StringRedisSerializer());
44+
Long increment = redisTemplate.opsForValue().increment("increment", 1);
45+
System.out.println(longValueOperations.get("increment"));
46+
Long long1 = longValueOperations.get("increment");
47+
System.out.println(increment);
48+
System.out.println(long1);
49+
}
2250
@Test
2351
public void t1() {
2452
AdminUser u = new AdminUser("122", "322");

‎static/src/admin/js/login.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ $(function() {
4343
$.post(adminContextPath + "/login.do", {
4444
username : username,
4545
password : password,
46-
rememberMe : $("input[name='rememberMe']").val()
46+
rememberMe : $("input:checked[name='rememberMe']").val()
4747
}, function(respone) {
4848
if (respone.responeCode == "0") {
4949
sessionStorage.clear();

0 commit comments

Comments
 (0)
Please sign in to comment.