Posted on 2008-05-23 09:41
寒武纪 阅读(4119)
评论(1) 编辑 收藏 所属分类:
Java
普通的程序交互方式有命令行和GUI形式。对于GUI样式,交互的设计可以多种多样,但是Java做命令行交互,似乎存在着一些不足。
命令行交互是传统的交互方式,如果程序有时候需要在Unix或是Linux等系统上运动时,以这种方式出现的可能性就比较大。命令行包括
输入和回显问题,一般是以行结束,或是以某个结束符为终命令终止标识。System.out 和System.err就用于标准的输出和错误输出,System.in用于标准的输入接受,一般情况下都是指键盘。
如果接受参数输入,一般的程序结构如下:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.println("==Please input password==:");
String pass = in.readLine();
输入的时候显示屏自动进行输入回显。这个时候如果遇到输入密码等敏感数据的时候,就无法用*或是#这样的符号进行回显屏蔽,容易暴露安全问题。
解决的可能想法:
1. 通过监听键盘事件,对输入的回显进行截获取,把回显进行屏蔽,但是监听器如何知道何时是输入密码,何时是输入普通数据?比较难以控制,而且这种监听应该是线程化的,可能会存在一些意想不到的问题。
2. 如果用纯Java难以实现,那么是否可以使用其它语言的功能进行补充,比如JNI,或是Windows下面的Dos脚本,Linux平台的Shell脚本来进行补充。不过这样就不太平台无关了。
3. 可能sun发现了这个不足之处,从1.6版本开始,增加了一个java.io.Console类,代表与当前 Java 虚拟机关联的基于字符的控制台设备,这个Console是对原来System.in这种不足的补充,提供了像
readPassword()
等这样的实用方法,具体请参考API文档,就是专门用于对敏感信息的读取。但是这是基于Java1.6的,如果有些场景受限制,不能使用1.6,那么还是无法解决上面的问题。后来查阅了一下Console类的实现方式,想直接把它的实现方式移植到1.4.xx上是比较难的,因为用到了一些高版本的新特性。使用Console要注意的是:虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。如果你在Eclipse里面启动程序调用Console,那么通常是没有控制台,还是得从外部的命令行方式才能调用得到。
总体想一下,感觉应该还是从第2点出发,牺牲掉一点通用性,这样才能满足这种功能需求。
刚进场的时候戏就落幕