sécurité - java une application non signée demande un accès illimité au système




La requête HTTP Java se bloque occasionnellement (3)

Je ne vois aucun problème avec le code. Il se peut que votre plate-forme ait un bogue intermittent ou que le site Web bloque la connexion. Changer les paramètres de connexion, tels que garder en vie, peut aider.

Mais, même avec un ensemble de temporisation, Sockets peut rester indéfiniment - un ami m'a bien démontré cela il y a quelques années en retirant le câble réseau - mon programme est resté bloqué là pour toujours, même avec un SO_TIMEOUT réglé à 30 secondes.

En tant que «meilleure pratique», vous pouvez éviter de suspendre votre application en déplaçant toutes les communications réseau vers un fil distinct. Si vous encapsulez chaque requête en tant que Runnable et que vous les mettez en file d'attente, vous gardez le contrôle sur les délais (la synchronisation est toujours en Java, plutôt qu'un appel d'E / S natif bloquant). Vous pouvez interrompre votre fil d'attente après (par exemple) 30 pour éviter de bloquer votre application. Vous pouvez alors informer l'utilisateur ou réessayer la demande. Comme la requête est exécutable, vous pouvez la retirer de la file d'attente du thread en attente et la programmer pour l'exécuter sur un autre thread.

Pour la plupart du temps, mes requêtes HTTP fonctionnent sans problème. Cependant, parfois ils vont se bloquer.

Le code que j'utilise est configuré de sorte que si la requête réussit (avec un code de réponse de 200 ou 201), alors appelez screen.requestSucceeded (). Si la requête échoue, appelez screen.requestFailed ().

Cependant, lorsque la requête se bloque, elle le fait avant que l'une des méthodes ci-dessus ne soit appelée. Y at-il un problème avec mon code? Dois-je utiliser une sorte de meilleure pratique pour éviter toute pendaison?

Voici mon code. J'apprécierais toute aide. Merci!

HttpConnection connection = (HttpConnection) Connector.open(url
                    + connectionParameters);

            connection.setRequestMethod(method);
            connection.setRequestProperty("WWW-Authenticate",
                    "OAuth realm=api.netflix.com");
            if (method.equals("POST") && postData != null) {
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            connection.setRequestProperty("Content-Length", Integer
                    .toString(postData.length));
            OutputStream requestOutput = connection.openOutputStream();
            requestOutput.write(postData);
            requestOutput.close();
        }
            int responseCode = connection.getResponseCode();
            System.out.println("RESPONSE CODE: " + responseCode);
            if (connection instanceof HttpsConnection) {
                HttpsConnection secureConnection = (HttpsConnection) connection;
                String issuer = secureConnection.getSecurityInfo()
                        .getServerCertificate().getIssuer();
                UiApplication.getUiApplication().invokeLater(
                        new DialogRunner(
                                "Secure Connection! Certificate issued by: "
                                        + issuer));

            }

            if (responseCode != 200 && responseCode != 201) {
                screen.requestFailed("Unexpected response code: "
                        + responseCode);
                connection.close();
                return;
            }

            String contentType = connection.getHeaderField("Content-type");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            InputStream responseData = connection.openInputStream();
            byte[] buffer = new byte[20000];
            int bytesRead = 0;
            while ((bytesRead = responseData.read(buffer)) > 0) {
                baos.write(buffer, 0, bytesRead);
            }
            baos.close();
            connection.close();
            screen.requestSucceeded(baos.toByteArray(), contentType);
        } catch (IOException ex) {
            screen.requestFailed(ex.toString());
        }

Sans aucune trace, je tire juste dans l'obscurité.

Essayez d'ajouter ces 2 appels,

System.setProperty("http.keepAlive", "false");

connection.setRequestProperty("Connection", "close");

Keep-alive est une cause fréquente de connexions périmées. Ces appels le désactiveront.


J'ai remarqué ce problème aussi sur le BlackBerry OS 5.0. Il n'y a aucun moyen de reproduire cela de manière fiable. Nous avons fini par utiliser un thread supplémentaire en utilisant wait / notify avec Timertask.







hang