查看org.quickserver.net.server.QuickServer的文档(docs文件夹下)你可以注意到里面有一个方法
public void setAuthenticator(java.lang.String authenticator)
阅读文档可知此方法中的authenticator字符串是实现org.quickserver.net.server.Authenticator接口的方法的全名。
Authenticator接口有两个实现:
org.quickserver.net.server.QuickAuthenticator:这个类用来验证连接QuickServer的客户端。它只用一个实例处理所有的QuickServer验证。(推荐)
org.quickserver.net.server.ServerAuthenticator:这个类同样用来验证连接QuickServer的客户端,但对每一个验证的处理都会创建一个实例。
接下来给EchoServer加验证功能。简单点,客户端输入的用户名和密码一致就算验证通过。
首先,在同样的文件夹里创建一个验证类:EchoServerQuickAuthenticator
01 package echoserver; 02 03 import org.quickserver.net.server.*; 04 import java.io.*; 05 06 public class EchoServerQuickAuthenticator extends QuickAuthenticator { 07 08 public boolean askAuthorisation(ClientHandler clientHandler) 09 throws IOException { 10 String username = askStringInput(clientHandler, "User Name :"); 11 String password = askStringInput(clientHandler, "Password :"); 12 13 if(username==null || password ==null) 14 return false; 15 16 if(username.equals(password)) { 17 sendString(clientHandler, "Auth OK"); 18 return true; 19 } else { 20 sendString(clientHandler, "Auth Failed"); 21 return false; 22 } 23 } 24 } |
接下来我们要告诉QuickServer使用我们新创建的验证类来做验证器。修改前一章创建的EchoServer.java文件,代码如下(粗体为修改的代码):
01 package echoserver; 02 03 import com.ddost.net.*; 04 import com.ddost.net.server.*; 05 06 import java.io.*; 07 08 public class EchoServer { 09 10 public static void main(String s[]) { 11 12 QuickServer myServer = 13 new QuickServer("echoserver.EchoCommandHandler"); 14 myServer.setAuthenticator( 15 "echoserver.EchoServerQuickAuthenticator"); 16 myServer.setPort(4123); 17 myServer.setName("EchoServer v 1.0"); 18 try { 19 myServer.startServer(); 20 } catch(AppException e){ 21 System.err.println("Error in server : "+e); 22 } 23 } 24 } |
OK,将修改好的文件编译,按照前一章讲述的方法运行程序。这次当我们点击"Connect"时,浏览器会要求我们输入用户名和密码。如果输入的用户名和密码一致就可以登录。如果输入错误五次以上,浏览器会提示"-ERR Max Auth Try Reached"并自动断开连接。这个次数和提示信息可以通过QuickServer类的setMaxAuthTry() 和 setMaxAuthTryMsg()修改。
有时在验证过程中我们可能需要中途退出而不是等待验证结束,这时输入"Quit"是不起作用的。我们可以这样修改代码,有两个方法:
一是从EchoServerQuickAuthenticator类中的askAuthorisation()方法抛出一个org.quickserver.net.AppException异常,代码如下:
String username = askStringInput(clientHandler, "User Name :");
if (username != null &&
username.equalsIgnoreCase("QUIT")) {
sendString(clientHandler, "Logged out.");
throw new AppException("Quit");
}
或者参考ClientHandler,关闭连接,代码如下:
String username = askStringInput(clientHandler, "User Name :");
if (username != null &&
username.equalsIgnoreCase("QUIT")) {
sendString(clientHandler, "Logged out.");
clientHandler.closeConnection();
return false;
}
ClientHandler对象能够提供很多客户端连接的有用信息,如IP地址。更多信息请参考API文档。
注意:
o 不要在验证器类中存贮任何客户端相关信息,如果需要,必须存放在ClientData类中--下一章将讲解该部分内容。
o 必须确认askAuthorisation()方法是线程安全的。