2017-09-27 162 views
0

我有一个应用程序在服务器上运行。一旦用户尝试连接到服务器,他会发送一个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端? 任何帮助,将不胜感激。谢谢。

+0

如果从两个请求输出是准确的,那么它似乎是Android的客户端发送一个额外的可能这是服务器端处理消息的问题吗?你可以发布更多的服务器代码来看看它实际上在做什么吗? – Guenther

+0

我添加了更多的代码 – Dan

+0

@Maddy我检查了可能的重复那里没有我没有试过的东西。我的所有进口都是他们应该的方式,而我正在做与各种答案中所建议的相同的事情。 – Dan

回答

0

而不是直接使用“UTF-8”作为字符串参数,使用StandardCharsets.UTF_8,同时从android中的字符串执行getBytes,或者如果您指向较低的api级别,则使用如下所述。

而不是

bt = usps.getBytes("UTF-8"); 

使用本

bt = usps.getBytes(Charset.forName("UTF-8")) 
+0

更改我的代码以使用'bt = usps.getBytes(Charset.forName(“UTF-8”))',结果是同一个服务器停留在解码上。 – Dan

0

问题解决了。 显然在线路: requestmsg += "Authorization: Basic " + base64 + "\r\n\r\n" 的Android是在'\ r \ n \ r \ n”之前加入额外\n