希望我不需要使用我的代码来填充此帖子,但如果需要,请询问。
另外,我只使用getPassword().toString()
进行测试,我不会在任何应用程序中使用它。
客户端:
从JPasswordField passfield
获取密码,通过ObjectOutputStream out
服务器端:
通过ObjectInputStream in
接收字符串,将其打印到控制台
很简单,但我遇到的问题是它不是显示String,而是打印一个对象([C @ 6af3a631) 我发送和接收对象的方式非常简单:
客户端:
out.writeObject(passfield.getPassword().toString())
服务器:
Object data;
while((data = in.readObject) != null) {
if(data instanceof String) {
System.out.println(data);
}
}
如果我发送"hey"
而不是passfield.getPassword().toString())
,则字符串打印出来就好了。
我对ObjectOutputStream非常熟悉,而且我从未遇到过这个问题,所以我猜它可能与JPasswordField
这是帮助我理解更大问题的一小步(包含密码的数据包发送得很好,收到的数据包很好,但密码var以null形式出现)。
答案 0 :(得分:2)
您正在toString()
上致电char[]
。这不符合您的想法 - 它将返回类似“[C @ 6af3a631”的内容,因为数组不会覆盖toString()
。您最终得到toString()
的默认实施Object
:
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。 / p>
你可以使用:
// Eek - security problem!
out.writeObject(new String(passfield.getPassword());
...但是这会在内存中留下一个字符串,然后无法清除。它也以明文形式传输密码,除非以其他方式保护此流,否则这是非常糟糕的。
我怀疑你可以使用:
out.writeObject(passfield.getPassword());
将char[]
作为对象传输,您将在另一端获得相同的char[]
。它虽然没有解决“传输密码”的问题 - 然后你仍然需要清除char[]
以避免在内存中访问密码。