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()方法是線程安全的。

發佈了27 篇原創文章 · 獲贊 10 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章