我有一個應用程序在服務器上運行。一旦用戶嘗試連接到服務器,他會發送一個GET請求。根據請求中傳遞的用戶名和密碼,服務器對用戶進行身份驗證。Base64解碼/使用java/android編碼
我能夠使用用java編寫的客戶端代碼連接到服務器。我使用以產生GET請求的代碼是:
private String GETrequest(String nMountpoint, String nUsername, String nPassword){
String requestmsg = "";
requestmsg += "GET /" + nMountpoint + " HTTP/1.0\r\n";
requestmsg += "Host: " + nServer +"\r\n";
requestmsg += "User-Agent: NTRIP Client v1\r\n";
requestmsg += "Ntrip-Version: Ntrip/2.0\r\n";
requestmsg += "Accept: */* \r\n";
requestmsg += "Connection: close\r\n";
if (nUsername.length() > 0) {
requestmsg += "Authorization: Basic " + Base64.getEncoder().encodeToString((nUsername + ":" + nPassword).getBytes(StandardCharsets.UTF_8)) + "\r\n\r\n";
}
return requestmsg;
}
當請求到達服務器和它處理它,我接收下一輸出:
GET /mP HTTP/1.0
Host: host.address.net
User-Agent: NTRIP Client v1
Ntrip-Version: Ntrip/2.0
Accept: */*
Connection: close
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
checking credentials
dGVzdHVzZXI6dGVzdHBhc3M=
lavrovson:exotech
User: testuser, Pass: testpass
服務器解碼的消息作爲刨光和該過程繼續運行。 但是,當我嘗試使用Android應用程序連接到服務器時,服務器端的進程卡住了。 我使用以產生關於機器人的GET請求的代碼是:
private String GETrequest(String nMountpoint, String nUsername, String nPassword){
String requestmsg = "";
requestmsg += "GET /" + nMountpoint + " HTTP/1.0\r\n";
requestmsg += "Host: " + nServer +"\r\n";
requestmsg += "User-Agent: NTRIP Client v1\r\n";
requestmsg += "Ntrip-Version: Ntrip/2.0\r\n";
requestmsg += "Accept: */* \r\n";
requestmsg += "Connection: close\r\n";
if (nUsername.length() > 0) {
String usps = nUsername + ":" + nPassword;
byte[] bt = null;
try {
bt = usps.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {e.printStackTrace();}
String base64 = Base64.encodeToString(bt, Base64.DEFAULT);
requestmsg += "Authorization: Basic " + base64 + "\r\n\r\n";
}
return requestmsg;
}
當請求到達服務器並嘗試將其解碼我接收下一輸出:
GET /mP HTTP/1.0
Host: host.address.net
User-Agent: NTRIP Client v1
Ntrip-Version: Ntrip/2.0
Accept: */*
Connection: close
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
checking credentials
dGVzdHVzZXI6dGVzdHBhc3M=
的方法得到卡在Base64編碼字符串的解碼上。 當試圖在服務器上的編碼字符串我用下面的代碼進行解碼:
byte[] valueDecoded = Base64.getDecoder().decode(decodedString);
String UserPass = new String(valueDecoded, StandardCharsets.UTF_8);
String[] UP = UserPass.split(":");
編輯: 一些額外的服務器代碼:
private void messageParsing(byte[] bt){
String MSG = new String(bt);
if (bt.length > 4){
System.out.println(MSG);
}
String tokens[] = MSG.split(" ");
// GET request parsing
if (tokens[0].matches("GET") && tokens[1].length()>1){
if (secure){
if(conn_logger.isTraceEnabled()){
conn_logger.trace("Client at adress " + secureSocket.getRemoteSocketAddress());
}
} else {
if(conn_logger.isTraceEnabled()){
conn_logger.trace("Client at adress " + socket.getRemoteSocketAddress());
}
}
System.out.println("checking credentials");
chekCredentials(tokens);
}
}
的checkCredentials
方法:
private void chekCredentials(String[] tokens){
String[] encoded = tokens[tokens.length-1].split("\r\n");
System.out.println(encoded[0]);
byte[] valueDecoded = Base64.getDecoder().decode(encoded[0]);
System.out.println(new String(valueDecoded));
String UserPass = new String(valueDecoded, StandardCharsets.UTF_8);
String[] UP = UserPass.split(":");
System.out.println("User: " + UP[0] + ", Pass: " + UP[1]);
// Some stuff to do with user/password
.
.
.
}
所以問題是爲什麼服務器代碼不能解碼bas e64編碼的字符串是來自android應用程序? 我在做一些錯誤的編碼過程在Android端? 任何幫助,將不勝感激。謝謝。
如果從兩個請求輸出是準確的,那麼它似乎是Android的客戶端發送一個額外的可能這是服務器端處理消息的問題嗎?你可以發佈更多的服務器代碼來看看它實際上在做什麼嗎? – Guenther
我添加了更多的代碼 – Dan
@Maddy我檢查了可能的重複那裏沒有我沒有試過的東西。我的所有進口都是他們應該的方式,而我正在做與各種答案中所建議的相同的事情。 – Dan