2010-10-26 10 views
15

Mit einem Jetty-Server programmgesteuert eingerichtet, auf den ich versuche, über Ajax und XmlHttpRequest zuzugreifen. Ohne Genehmigung funktioniert der Anruf gut, aber mit, bekomme ich 401 Unauthorized. Irgendwelche Vorschläge.Jetty, Preflight und Ajax

Javascript Aufruf sieht wie folgt aus (verkürzt):

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); 
} 

Server-Code sieht wie folgt aus (noch kürzer)

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

Ich denke, das wird Ihnen [1] nützlich sein. (Http://docs.codehaus.org/display/JETTY/How+to+Configuration+Security+mit+Embedded+Jetty). Ich kann auch sehen, dass die Anmeldeinformationen, die Sie von Javascript eingeben, "var auth = base64encode ('name', 'pwd');". Das bedeutet, die Anmeldeinformationen für "Name" sind "pwd" und es sollte an der Anlegestelle mit der relevanten Rolle vorhanden sein. – nibin012

+0

Warum legen Sie den Anforderungsheader "Authorization" direkt auf dem Clientcode fest? Warum verwenden Sie nicht die XmlHttpRequest-Unterstützung für die Authentifizierung in der open() -Methode? Auch nicht sicher, ob Ihre Base64encode-Funktion die Auth-Variable als "Name: Pwd" formatiert. –

+0

Es sieht so aus, als würden Sie eine asynchrone Anfrage machen, aber versuchen, die Antwort synchron zu lesen? Ist das nur eine Vereinfachung, die Sie beim Posten dieser Frage gemacht haben? Wenn nicht, müssen Sie der 'onreadystatechange'-Eigenschaft des' xmlhttp'-Objekts eine Callback-Funktion zuweisen. –

Antwort

1

Was macht Ihr base64encode Funktion mit den beiden Parametern tun? Der Wert des Headers Authorization muss der Base64-codierte Wert der Zeichenfolge username:password sein. (Notieren Sie den Doppelpunkt.)

Hinweis: Für denselben Ursprung XMLHttpRequests können Sie den Benutzernamen und das Kennwort als Parameter für die Methode open angeben.

0

sollte der Authorization-Header wie das folgende Beispiel aussehen:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

Wo der Text nach "Basic" eine Base64 Codierung ist mit: für weitere Informationen

prüfen Sie diesen Link: http://en.wikipedia.org/wiki/Basic_access_authentication