gpt4 book ai didi

java - 在 Java LoginModules 之间传递信息(通用映射问题)

转载 作者:行者123 更新时间:2023-11-30 09:47:45 25 4
gpt4 key购买 nike

我目前正在尝试编写一些登录模块以使用户能够登录到 Java 应用程序。这是我的 .java.login.config 文件:

"Java Application" {
path.to.login.module.PamLoginModule sufficient;
path.to.login.module.OtherLoginModule sufficient;
};

因此,如果 PamLoginModule 失败,我想将信息传递给 OtherLoginModule。这样,OtherLoginModule 就不必再次询问用户名和密码。所以我猜这就是 sharedState Map 在 initialize() 函数中的作用:

initialize(Subject subject, CallbackHandler callbackHandler, 
Map<String,?> sharedState, Map<String,?> options)

问题是您不能将东西放入 sharedState 映射中。如果我做类似的事情:

sharedState.put("key", value); // Value is a string

编译器提示:

path/to/login/module/PamLoginModule.java:48: put(java.lang.String,capture#833 of ?) in java.util.Map<java.lang.String,capture#833 of ?> cannot be applied to (java.lang.String,java.lang.String)
this.sharedState.put("key", value);

我找到了解决这个问题的方法,但我想知道正确的方法是什么。

首先,我可以使用 java 1.4.2 版本的初始化,它是:

initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) 

这样我就可以接收通用 map ,我可以将 Map 对象转换为 Map

Map<String,Object> this.sharedState = (Map<String,Object>)sharedState;

问题是我仍然遇到未经检查的转换异常。现在,我知道制作 LoginModule 接口(interface)的人并不傻,所以我想知道他们为什么将 sharedState 映射为 Map<String,?>而不是 Map<String,Object> .另外,有没有更好的方法将东西放入 sharedState 映射?

谢谢!

最佳答案

如果您查看 Java SDK 中的 LoginModule 实现,它们会将这些 map 保存到没有generics 信息的本地字段中,即普通 map 。在代码中,他们确实将对象放在那里(至少在用户通过身份验证时)。所以在 LoginModule 接口(interface)中使用问号一定是设计错误。

关于java - 在 Java LoginModules 之间传递信息(通用映射问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6535610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com