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

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

    现在我们给刚刚创建的服务器添加认证功能。
    查看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()方法是线程安全的。

---------------
补充:
从1.4.6版本开始:
setAuthenticator
改为
setClientAuthenticationHandler

你可能感兴趣的:(java,网络,职场,休闲)