Java密码屏蔽输入的实现方法

原文地址:http://www.fengfly.com/plus/view-10100-1.html

1 前言 

  大家知道,在登录Microsoft Windows操作系统过程中,在登录窗口中需要用户输入注册用户名称和密码。细心的读者会发现:用户输入的注册用户名称内容为原码字符显示,而注册密码内容为掩码字符显示。例如,同样在两各文本区中输入字符"a",在用户名文本区中显示的是字符"a",而在密码区中显示的字符为掩码"*",这就是所谓的密码屏蔽输入。将输入的密码屏蔽回显,不仅增强了用户私有信息的安全性,更重要的是维护了计算机系统的稳定性和安全性。 

  Java以其语言的面向对象能力、高安全性和Java平台的系统无关性等技术优势,在商务软件开发过程中赢得了众多程序设计人员的青睐。JDK在AWT和JFC类库中定义了用于密码字符屏蔽的应用程序设计接口(API),使应用系统开发人员在编写图形用户界面程序时,能够灵活地定义密码回显方式。但是,对于基于命令行方式的Java应用程序,JDK没有定义相应的密码屏蔽策略,程序设计人员必须编写字符回显控制代码。本文将通过对实例代码的分析,对基于JDK平台开发Java应用程序的密码屏蔽输入方法进行探讨,主要内容包括: 

  ●AWT组件对象密码屏蔽方法 

  ●JSwing组件对象密码屏蔽方法 

  ●Java命令行程序密码屏蔽方法 


  2 利用AWT组件实现密码屏蔽输入 


  Java抽象窗口工具包(Abstract Window Toolkit,AWT)是在JDK1.0版本中定义的用于编写Java图形用户界面程序的应用程序设计接口,程序设计人员可以利用该包中定义的多种类型组件对象,编写具有用户界面的应用程序。 

  为了实现用户输入信息的屏蔽,可以利用AWT组件库中定义的TextField对象,该对象的定义继承结构如下: 

java.lang.Object
|
+--java.awt.Component
|
+--java.awt.TextComponent
|
+--java.awt.TextField



  在该对象中,定义了用于设置和维护用户输入字符回显方式的方法,这些方法的定义形式为: 

    char getEchoChar():获取用户定义的文本区回显字符; 

    boolean echoCharIsSet()判断是否定义了回显字符; 

    void setEchoChar(char c):设置文本区回显字符为字符c。 

  因此,在读者编写的Java程序中,可以在创建TextField对象实例后,例如上述方法控制文本区回显字符的方式。下面的程序完整地演示了回显字符的定义方式: 

//PasswordMaskingDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;

public class PasswordMaskingDemo
{
public static void main(String args[])
{
final Frame frmFrame = new Frame();
Panel pnlPanel = new Panel();

Label lblUsername = new Label("用户名");
Label lblPassword = new Label("密码");
final TextField txtUsername = new TextField("Anyomonus");
final TextField txtPassword = new TextField("", 8);

txtUsername.setEditable(false);
txtPassword.setEchoChar(´*´);
Button btnButton1 = new Button("登录");
Button btnButton2 = new Button("其它用户登录");
Button btnButton3 = new Button("关闭");

btnButton1.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if( (txtPassword.getText()).length() == 0 )
{
JOptionPane.showMessageDialog
    (frmFrame, "密码不能为空");
return;
}
txtPassword.setColumns(16);
System.out.println("Anyomonus用户的密码:" +
      txtPassword.getText() );
}
});
btnButton2.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
txtUsername.setEditable(true);
}
}); 
btnButton3.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
pnlPanel.add(lblUsername); 
pnlPanel.add(txtUsername); 
pnlPanel.add(lblPassword); 
pnlPanel.add(txtPassword); 
pnlPanel.add(btnButton1);
pnlPanel.add(btnButton2);
pnlPanel.add(btnButton3);

frmFrame.add(pnlPanel);
frmFrame.setTitle("演示TextField对象的应用方法");
frmFrame.pack();
frmFrame.show(); 
}
}

  该程序运行的窗口形式如下图所示: 


Java密码屏蔽输入的实现方法_www.fengfly.com
screen.width-333)this.width=screen.width-333;">

  图1 PasswordMaskingDemo.java程序运行窗口 

在上述程序中,与文本区回显控制相关的代码为: 
final TextField txtPassword = new TextField("", 8);
txtPassword.setEchoChar(´*´);

在上面的代码中,首先创建初始内容为空、可输入8个字符的TextField对象实例txtPassword后,利用TextField对象中定义的setEchoChar方法设置该文本区的回显字符为星号"*",从而实现输入字符的掩码。因此总结为:可以利用TextField对象中定义的setEchoChar方法,实现AWT组件对象程序中的字符掩码输入和回显控制。 

3 利用JSwing组件对象实现密码屏蔽输入 

  JSwing组件对象是轻量级Java组件对象,其中定义了多种组件对象类型,而且其外观也更加新颖。与AWT组件对象相对应,在JSwing组件对象中也定义了JTextField对象,用于用户进行文本输入。那么,读者是否会联想利用对象中也定义的setEchoChar方法定义回显字符呢?实际情况不是这样。在JTextField对象中没有定义该方法,而是以JTextField为父对象,定义了用于进行密码输入的文本区对象JPasswordField,该对象的定义继承结构如下: 

java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.text.JTextComponent
|
+--javax.swing.JTextField
|
+--javax.swing.JPasswordField



  在JPasswordField对象中,定义了多种类型用于控制字符回显方式的方法,其中setEchoChar方法即用于定义文本区回显字符,如下面代码段所示: 
… …
JPasswordField password = new JPasswordField(8);
password.setEchoChar(´*´);
… …

  与AWT组件对象定义文本区的回显方式类似,上述代码创建了JPasswordField对象实例后,设置该对象的回显字符为星号"*"。但是,读者需要注意的是:在JSwing对象中,需要利用JPasswordField对象来管理用户输入文本。 

4 Java命令行程序密码屏蔽输入实现方式 

  与基于AWT或者JSwing的图形用户界面程序相比,在基于命令行的Java程序中实现密码屏蔽输入要比较麻烦一些,原因在于JDK没有提供任何基于文本的字符回显控制方法,因此需要编写相应的控制代码。基于通用性方面的考虑,在本文中将编写用于屏蔽用户输入的对象InputMasking,该对象的定义如下: 

//InputMasking.java
import java.io.*;

public class InputMasking
{
String getPassword(String initial) throws IOException 
{
MaskingThread listeningthread = new MaskingThread(initial);
Thread thread_instance = new Thread(listeningthread);
String password = "";
thread_instance.start(); 
while (true) 
{
char input = (char)System.in.read();
listeningthread.stopMasking();
if (input == ´ ´) 
{
input = (char)System.in.read();
if (input == ´ ´) 
break; 
else 
continue; 
}
else if(input == ´ ´) 
break; 
else 
password += input; 
}
return password;
}
}
  该对象在后台启动线程的控制下,从系统输入设备中读取字符并对该字符进行分析。如果遇到行结束标志,则返回该线程获取的字符串对象password。读者一定会关心后台线程对象MaskingThread的作用,该线程对象周期地刷新终端窗口,其目的在于屏蔽用户输入的字符,使该字符不能够在窗口中显示出来。该线程对象的定义为: 

//MaskingThread.java
import java.io.*;

class MaskingThread extends Thread 
{
private boolean stop = false;
private int index;
private String initial;

public MaskingThread(String initial) 
{
this.initial = initial;
}
public void run() 
{
while(!stop) 
{
try 
this.sleep(1);
}
catch (InterruptedException ex) 
{
ex.printStackTrace();
}
if (!stop) 
{
System.out.print(" " + initial + " " + initial);
}
System.out.flush();
}
}
public void stopMasking() 
{
this.stop = true;
}
}
  在InputMasking对象和MaskingThread对象的配合下,使得基于命令行的Java应用程序能够实现用户输入密码字符的屏蔽,其核心方法是利用后台线程时时刷新终端窗口,屏蔽用户输入字符。下面的CmdLineUtility对象即利用前面定义的两个对象进行用户输入屏蔽,请读者实际运行上述程序,以了解命令行Java程序屏蔽输入的方式: 

//CmdLineUtility.java
import java.io.*;

public class CmdLineUtility
{
public static void main(String argv[]) 
{
InputMasking masking = new InputMasking();
String password = null; 
try 
{
password = masking.getPassword("请输入登录密码: ");
catch(IOException ex) 
{
ex.printStackTrace();
}
System.out.println("您输入的密码为: " + password);
}
}

5 结束语 

  本文着重讲解了基于Java语言编写图形用户界面程序和命令行程序中,实现用户输入字符屏蔽的方法。从文中内容可以看出:对于图形用户界面程序,无论利用AWT组件对象,还是利用JSwing组件对象,均可以利用相应的组件对象并调用对象实例中定义的方法,实现用户输入字符的屏蔽,从而简化了代码编写难度。 

  对于基于命令行的Java程序,由于JDK中没有定义相应的Java对象,因此,需要编写屏蔽用户输入的代码,将用户输入不显示在终端窗口中,从而实现用户输入屏蔽。 

对于校长信箱版块的Java jsp代码,您可以参考以下实现方式: 1. 身份验证 可以使用Session来进行身份验证,首先在登录页面中将用户输入的用户名和密码提交到后台,后台进行验证,验证成功则在Session中添加登录标识。在校长信箱页面中,每次访问时也需要验证Session中是否存在登录标识,如果不存在则跳转到登录页面。 2. 屏蔽帖子 可以在数据库中添加屏蔽帖子表,保存需要屏蔽的帖子ID。在展示帖子列表时,可以查询屏蔽表并排除这些帖子。另外,可以在帖子详情页中添加屏蔽按钮,点击后将该帖子ID添加到屏蔽表中。 3. 数据库存储 在数据库中创建帖子表,保存帖子标题、内容、作者、发布时间等信息。在用户提交新帖时,将相关信息插入到帖子表中。在展示帖子列表或帖子详情页时,从数据库中查询相应的信息并展示。 下面是一个简单的示例代码: 1. 登录页面 ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <form method="post" action="login.jsp"> <label>用户名:</label> <input type="text" name="username"><br> <label>密码:</label> <input type="password" name="password"><br> <input type="submit" value="登录"> </form> </body> </html> ``` 2. 登录处理页面 ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String username = request.getParameter("username"); String password = request.getParameter("password"); // 验证用户名和密码 if ("admin".equals(username) && "admin".equals(password)) { // 登录成功,将登录标识保存到Session中 session.setAttribute("login", true); response.sendRedirect("index.jsp"); } else { // 登录失败,跳转到登录页面 response.sendRedirect("login.jsp"); } %> ``` 3. 校长信箱页面 ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 验证登录状态 if (session.getAttribute("login") == null) { response.sendRedirect("login.jsp"); } else { // 查询帖子列表并展示 List<Post> postList = postDao.getPostList(); for (Post post : postList) { // 判断是否屏蔽 if (!shieldDao.isShield(post.getId())) { out.println(post.getTitle()); out.println(post.getContent()); out.println(post.getAuthor()); out.println(post.getCreateTime()); } } } %> ``` 4. 屏蔽帖子处理页面 ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 验证登录状态 if (session.getAttribute("login") == null) { response.sendRedirect("login.jsp"); } else { String postId = request.getParameter("postId"); // 添加到屏蔽表中 shieldDao.addShield(postId); response.sendRedirect("index.jsp"); } %> ``` 5. 数据库操作类 ```java public class PostDao { public List<Post> getPostList() { // 查询帖子列表 } public void addPost(Post post) { // 添加新帖子 } } public class ShieldDao { public boolean isShield(String postId) { // 判断帖子是否被屏蔽 } public void addShield(String postId) { // 添加帖子到屏蔽表中 } } public class Post { private String id; private String title; private String content; private String author; private Date createTime; // getter/setter } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值