2010-10-26 4 views
15

Avoir un serveur Jetty mis en place par programme auquel j'essaie d'accéder via ajax et xmlHttpRequest. Sans autorisation, l'appel fonctionne bien mais avec, je reçois 401 non autorisé. Toutes les suggestions.Jetty, preflight et ajax

appel Javascript ressemble à ceci (raccourci):

var auth = base64encode('name','pwd'); 
try{ 
    var xmlhttp = new XMLHttpRequest(); 
    xmlhttp.open("POST", "http://127.0.0.1:5563/ajax/index.html", true); 
    xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 
    xmlhttp.setRequestHeader('Authorization', auth); 
    xmlhttp.withCredentials = 'true'; 
    xmlhttp.send(); 
    xmlDoc = xmlhttp.responseXML; 
    $('#textResult').val(xmlDoc); 
} 
catch(e){ 
    $('#textResult').val('CATCH: ' + e); 
} 

code serveur ressemble à ceci (encore plus court)

class CallObject extends HttpServlet { 
    //... 
    @Override 
    public void doOptions(HttpServletRequest request, HttpServletResponse response) 
    throws IOException 
    { 
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Methods", 
         "GET, POST, HEAD, OPTIONS"); 
    response.setHeader("Access-Control-Allow-Credentials", "true"); 
    response.setHeader("Access-Control-Allow-Headers", 
         "X-Requested-With, authorization"); 
    } 
//... 
} 

class WebServer{ 
//... 
    SecurityHandler sh = null; 
    if (logins != null && logins.length > 0){ 
     String role = "user"; 
     sh = new SecurityHandler(); 
     Constraint constraint = new Constraint(); 
     constraint.setName(Constraint.__BASIC_AUTH); 
     constraint.setRoles(new String[]{role}); 
     constraint.setAuthenticate(true); 
     ConstraintMapping cm = new ConstraintMapping(); 
     cm.setConstraint(constraint); 
     cm.setPathSpec("/*"); 
     HashUserRealm hur = new HashUserRealm(); 
     hur.setName("eMark Web Server"); 
     for (int i = 0; i < logins.length; i++) { 
      String user_name = logins[i][0]; 
      String password = logins[i][1]; 
      hur.put(user_name, password); 
      hur.addUserToRole(user_name, role); 
     } 
     sh.setUserRealm(hur); 
     sh.setConstraintMappings(new ConstraintMapping[]{cm}); 
     _server.setHandlers(
      new Handler[]{sh, _contexts, new DefaultHandler()}); 
    } 
//... 
} 
+0

Je suppose que cela vous sera utile [1]. (Http://docs.codehaus.org/display/JETTY/How+to+Configure+Security+with+Embedded+Jetty). Je peux également voir que les informations d'identification que vous entrez depuis javascript sont "var auth = base64encode ('nom', 'pwd');". Cela signifie que les informations d'identification de 'name' sont 'pwd' et qu'elles doivent être présentes sur la jetée avec le rôle correspondant. – nibin012

+0

Pourquoi définissez-vous directement l'en-tête de demande "Autorisation" sur le code client? Pourquoi ne pas utiliser le support XmlHttpRequest pour l'authentification dans la méthode open()? En outre, vous ne savez pas si votre fonction base64encode formate la variable auth en tant que "nom: pwd". –

+0

Il semble que vous faites une requête asynchrone, mais essayez de lire la réponse de manière synchrone? Est-ce juste une simplification que vous avez faite en publiant cette question? Sinon, vous devrez assigner une fonction de rappel à la propriété 'onreadystatechange' de l'objet' xmlhttp'. –

Répondre

1

Qu'est-ce que votre fonction base64encode faire avec les deux paramètres? La valeur de l'en-tête Authorization doit être la valeur codée en base64 de la chaîne username:password. (Notez les deux points.)

Remarque: pour les mêmes requêtes XMLHttpRequests d'origine, vous pouvez fournir le nom d'utilisateur et le mot de passe en tant que paramètre à la méthode open.

0

L'en-tête d'autorisation devrait ressembler à l'exemple suivant:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

Lorsque le texte apparaissant après « Basic » est un codage base64 de:

Vérifiez ce lien pour plus d'informations: http://en.wikipedia.org/wiki/Basic_access_authentication