您的位置:首页 > 产品设计 > UI/UE

QuickServer开发指南(4)- 添加认证

2005-02-25 11:39 405 查看
现在我们给刚刚创建的服务器添加认证功能。
查看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 }
这个类扩展了org.quickserver.net.server.QuickAuthenticator(第6行),在askAuthorisation()方法中(8行),通过askStringInput()方法要求客户端输入用户名和密码,并读入客户端输入的信息(10-11行)。这个方法继承自QuickAuthenticator。如果用户名与密码相等,发送正确信息并返回"true"(16-18行),否则发送错误信息并返回"false"(20-21行)。

接下来我们要告诉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()方法是线程安全的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: