web项目的用户验证信息可以存放在session中,访问下个页面的时候会先去session中查找判断。但如果是另一个app应用程序通过httpclient进来的话无法使用session来保存信息 (没有cookie), 这时每次请求都需要验证用户名密码,效率低。
可以新建一个Map的static成员变量, app第一次验证通过后将用户名密码保存在里面,再次进来的话只需要对比下Map中的数据就ok, 不需要再调用LDAP了。
需要对这Map对象加一层包装, 增加超时cleanup的功能, 隔一段时间会清理次。 依靠getItem时触发。 这个估计就是ehcache的原理了。
这里用到了 ConcurrentHashMap,由于是static的变量,会有多线程问题。
ConcurrentHashMap 的原理和Vector不一样, 不是用synchronized来加锁,
而是用segment,锁住一段空间来做。
以下是使用代码
附件中是CoreTimeBasedMap类
可以新建一个Map的static成员变量, app第一次验证通过后将用户名密码保存在里面,再次进来的话只需要对比下Map中的数据就ok, 不需要再调用LDAP了。
需要对这Map对象加一层包装, 增加超时cleanup的功能, 隔一段时间会清理次。 依靠getItem时触发。 这个估计就是ehcache的原理了。
这里用到了 ConcurrentHashMap,由于是static的变量,会有多线程问题。
ConcurrentHashMap 的原理和Vector不一样, 不是用synchronized来加锁,
而是用segment,锁住一段空间来做。
以下是使用代码
附件中是CoreTimeBasedMap类
private static final int CACHE_DURATION = 1000 * 60 * 60 * 4;
private static CoreTimeBasedMap authenticationCache = new CoreTimeBasedMap(
CACHE_DURATION);
private static boolean authenticateAgainstCache(String dn, String password) {
if (dn == null || password == null) {
return false;
}
if (authenticationCache.get(dn) != null) {
if (authenticationCache.get(dn).equals(password)) {
return true;
}
authenticationCache.remove(dn);
}
return false;
}