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