HashTable getcontainsKey不起作用



我不明白为什么这个简单的方法不能在中工作

我的类AccessChecker具有属性Hashtable<String, List<Permission>> permissions = new Hashtable<String, List<Permission>>();,有两种方法:

第一种方法

如果我把this.permissions.containsKey(key)放在这个方法的末尾,用一个好的密钥,它就可以工作了。

public void updatePermissions() {
List<Permission> permissionsTmp = permissionRepository.findAllWithEagerRelationships();
// clear permissions
this.permissions = new Hashtable<>();
// load all permissions
for (Permission permission : permissionsTmp) {
Profil profil = profilRepository.findOne(permission.getProfil().getId());
permission.setProfil(profil);
UserFonc user = userFoncRepository.findOne(permission.getUserFonc().getId());
permission.setUserFonc(user);
log.error("updatePermissions ** user login = " + user.getNom());
for (WebService webService: profil.getWebServices()) {
String key = createKeyPermissions(user.getNom().toLowerCase(), webService.getNom(), webService.getMethode());
log.error("updatePermissions ** key = " + key);
if (this.permissions.containsKey(key)){
this.permissions.get(key).add(permission);
}
else {
List<Permission> newPermissions = new ArrayList<>();
newPermissions.add(permission);
this.permissions.put(key, newPermissions);
}
}
}
}

第二种方法

但是,当我在方法hasAccessToWebservice()中这样做时,它对同一个键不起作用。。。

public boolean hasAccessToWebservice(HttpServletRequest request) {
boolean hasAccess = false;
String webservice = getServiceFromRequest(request);
String methode = request.getMethod();
String login = SecurityUtils.getCurrentUserLogin();
String userAgent = request.getHeader(Constants.USER_AGENT);
final String userLogin = SecurityUtils.getCurrentUserLogin();
log.error("hasAccessToWebservice ** user login = " + userLogin);
String key = createKeyPermissions(login.toLowerCase(), webservice, methode);
log.error("hasAccessToWebservice ** key = " + key);
log.error("hasAccessToWebservice ** element = " + this.permissions.size());
Set t = this.permissions.keySet();
log.error(t.toString());
if (this.permissions.containsKey(key)) {
log.error("hasAccessToWebservice ** key found !!");
hasAccess = true;
}
return hasAccess;
}

你能解释一下原因吗?

谢谢

问题摘要

总结本主题,问题围绕着关键一致性:

  1. Map.containsKey(Object key)主要依靠Object.hashCode()来检查key是否在Map.keySet()
  2. 您的映射密钥类是String。如果您查看String.hashCode()代码,您会发现它依赖于每个单个字符值。

    返回此字符串的哈希代码。String对象的哈希代码计算为

    s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

    使用int算术,其中s[i]是字符串的第i个字符,n是字符串的长度,^表示取幂。(空字符串的哈希值为零。)

    可以在ASCII表中找到值,突出显示hashCode()区分大小写

解决方案/改进

  • 最简单的解决方案是通过for接口将所有内容都小写,确保createKeyPermissions方法始终生成一致的密钥
  • 使用带比较器的TreeMap,其中最适合的是String.CASE_INSENSITIVE_ORDER

在运行hasAccessToWebservice 之前,您需要调用updatePermissions将所有数据放入您的权限中

如果您在没有updatePermissions的情况下运行hasAccessToWebservice,则权限列表中没有任何内容=>this.permissions.containsKey(key)不起作用

相关内容

  • 没有找到相关文章

最新更新