2013-03-04 3 views
1

J'ai rencontré un problème - renvoyer le message d'erreur 401 lorsque vous vous êtes déjà connecté et que vous essayez d'accéder à d'autres pages sécurisées. Le mystique de ce problème pour moi est que je peux avoir accès à d'autres pages sécurisées après avoir été connecté si je le vérifie via Firefox RestClient ou via l'application iOS mais que je ne peux pas y accéder via Chrome Advanced Rest Client et Android. Cependant, le type de contenu et les autres paramètres nécessaires sont définis de la même manière dans les outils Web et les applications. J'ai essayé de définir différents en-têtes auth avec un login encodé: pass mais il n 'a pas besoin de t help and it doesn car il devrait fonctionner sans cela, je pense (au moins FF et iOS fonctionnent sans cet entête). Qu'est-ce qui va mal?Android: réponse HTTP POST - 401

têtes de réponse de Chrome:

401 Unauthorized 

Loading time: 
29 
Request headers 
Content-Type: application/x-www-form-urlencoded 
Response headers 
Date: Mon, 04 Mar 2013 10:01:02 GMT 
Server: Apache/2.2.20 (Ubuntu) 
X-Powered-By: PHP/5.3.6-13ubuntu3.9 
Set-Cookie: peachy=qg3mjvchjh1oionqlhhv0jrn71; path=/ 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Vary: Accept-Encoding 
Content-Length: 96 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=utf-8 

têtes de réponse de Firefox:

Status Code: 200 OK 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection: Keep-Alive 
Content-Length: 202 
Content-Type: application/json 
Date: Mon, 04 Mar 2013 09:51:09 GMT 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Keep-Alive: timeout=5, max=100 
Pragma: no-cache 
Server: Apache/2.2.20 (Ubuntu) 
X-Powered-By: PHP/5.3.6-13ubuntu3.9 

C'est ma paix code Restful dans l'application Android:

public String serverRequest(int action, Bundle params) { 
    if (action == 0) { 
     if (Const.DEBUG_ENABLED) 
      Log.e(TAG, "You did not pass action."); 
     return "You did not pass action."; 
    } 

    try { 
     HttpRequestBase request = null; 
     HttpPost postRequest = null; 
     switch (action) { 
      case SIGN_IN: 
       request = new HttpPost(); 
       request.setURI(new URI(SIGNIN_URL)); 
       request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 

       postRequest = (HttpPost) request; 

       if (params != null) { 
       UrlEncodedFormEntity formEntity = new 
       UrlEncodedFormEntity(paramsToList(params)); 
       postRequest.setEntity(formEntity); 
       } 
       break; 

      case SIGN_OUT: 
       request = new HttpPost(); 
       request.setURI(new URI(SIGNOUT_URL)); 
       request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 
       break; 

      case BANK_CARD_VERIFY: 
       request = new HttpPost(); 
       request.setURI(new URI(BANK_CARD_VERIFY_URL)); 
       request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 

       postRequest = (HttpPost) request; 

       if (params != null) { 
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(paramsToList(params)); 
        postRequest.setEntity(formEntity); 
       } 
       break; 
     } 

     if (request != null) { 
      DefaultHttpClient client = new DefaultHttpClient(); 

      if (Const.DEBUG_ENABLED) 
       Log.d(TAG, "Executing request: " + actionToString(action) + ": " + urlToString(action)); 

      HttpResponse response = client.execute(request); 

      StatusLine responseStatus = response.getStatusLine(); 

      int statusCode = responseStatus != null ? responseStatus.getStatusCode() : 0; 
      Log.d(TAG, "Status code: " + statusCode); 
      } 
      } 

(Inscrivez-vous et la déconnexion est publique, la page bank_verify est sécurisée, l'application Android a les mêmes en-têtes de réponse que le chrome). Il semble qu'il y ait un problème avec la session ou quelque chose d'autre mais je ne suis pas sûr exactement.

EDIT: Il semble que j'ai trouvé quel est le problème ici. Dans l'application Android, je crée un nouvel objet HttpCLient car toutes les anciennes données sont perdues. Mais une autre question - comment rendre ce HttpCLient réutilisable?

+2

Si vous avez trouvé une réponse, postez-la * comme réponse * et acceptez-la. Pour une nouvelle question, veuillez ouvrir une nouvelle question. – sschrass

Répondre

0

Problème trouvé. Je réutilise httpClient à chaque fois, malgré cela, pour n'en utiliser qu'un seul qui contient toutes les données de session à chaque fois. Il suffit d'implémenter if pour vérifier si j'ai déjà un objet httpclient, sinon vous en créez un nouveau.