有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用java/安卓进行Base64解码/编码

我有一个在服务器上运行的应用程序。一旦用户试图连接到服务器,他就会发送GET请求。服务器根据请求中传递的用户名和密码对用户进行身份验证

我能够使用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

服务器按计划解码消息,进程继续运行。 然而,当我尝试使用安卓应用程序连接到服务器时,服务器端的进程卡住了。 我用于在安卓上生成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);
        }
     }

{}方法:

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
          .
          .
          .

}

所以问题是,为什么服务器代码无法解码来自安卓应用程序的base64编码字符串? 我是否在安卓端的编码过程中出错了? 任何帮助都将不胜感激。多谢各位


共 (2) 个答案

  1. # 1 楼答案

    问题解决了。 显然是这样的: requestmsg += "Authorization: Basic " + base64 + "\r\n\r\n" Android在“\r\n\r\n”之前添加了额外的\n

  2. # 2 楼答案

    不要直接使用“UTF-8”作为字符串参数,而是使用StandardCharset。在android中执行getBytes from string时使用UTF_8,或者如果您指向较低的api级别,请按照下面的说明使用

    而不是

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

    用这个

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