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

来源:互联网 发布:手机淘宝客源码 编辑:程序博客网 时间:2024/05/02 09:16
现在我们给刚刚创建的服务器添加认证功能。
查看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()方法是线程安全的

 

 原文地址 http://tb.blog.csdn.net/TrackBack.aspx?PostId=301457

 

原创粉丝点击