2010-10-26 16 views
15

Posiadanie serwera Jetty skonfigurowanego programowo, do którego próbuję uzyskać dostęp przez ajax i xmlHttpRequest. Bez autoryzacji, połączenie działa poprawnie, ale z, otrzymuję 401 Nieautoryzowane. Wszelkie sugestie.Pomost, preflight i ajax

JavaScript wywołanie wygląda następująco (skrócony):

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

kod Server wygląda następująco (nawet krócej)

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

Domyślam się, że przyda ci się to [1]. (Http://docs.codehaus.org/display/JETTY/How+to+konfiguruj+zabezpieczenie+z+budowanym+wtyką). Mogę również zobaczyć, że poświadczenia, które wprowadzasz z javascript, to "var auth = base64encode (" name "," pwd '); ". Oznacza to, że poświadczeniem dla "name" jest "pwd" i powinno być obecne na przystani o odpowiedniej roli. – nibin012

+0

Dlaczego ustawiasz nagłówek żądania "Authorization" bezpośrednio na kodzie klienta? Dlaczego nie skorzystać z obsługi uwierzytelniania XmlHttpRequest w metodzie open()? Ponadto, nie jesteś pewien, czy funkcja base64encode formatuje zmienną auth jako "name: pwd". –

+0

Wygląda na to, że wykonujesz żądanie asynchroniczne, ale próbujesz odczytać odpowiedź synchronicznie? Czy to tylko uproszczenie, które wprowadziłeś, publikując to pytanie? Jeśli nie, musisz przypisać funkcję wywołania zwrotnego do właściwości 'onreadystatechange' obiektu' xmlhttp'. –

Odpowiedz

1

Co twoja funkcja base64encode zrobić z tymi dwoma parametrami? Wartość nagłówka Authorization musi być zakodowaną wartością base64 ciągu username:password. (Uwaga dwukropek.)

Uwaga: dla tego samego pochodzenia XMLHttpRequests można podać nazwę użytkownika i hasło jako parametr metody open.

0

Nagłówek Upoważnienie powinno wyglądać jak na poniższym przykładzie:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

Jeżeli tekst znajdujący się po "Basic" to kodowanie base64 z:

Sprawdź ten link, aby uzyskać więcej informacji: http://en.wikipedia.org/wiki/Basic_access_authentication