2010-10-26 15 views
15

Ajax ve xmlHttpRequest aracılığıyla erişmeye çalıştığım programsal olarak bir Jetty sunucusu kurmak. İzinsiz olarak, çağrı gayet iyi çalışıyor, ancak 401 yetkisiz kişiyim. Herhangi bir öneri.Jetty, preflight ve ajax

JavaScript çağrısı (kısaltılmış) şöyle görünür:

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

Sunucu kodu (hatta daha kısa) şöyle

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

Sanırım bu sizin için geçerli olacak [1]. (Http://docs.codehaus.org/display/JETTY/How+to+Configure+Security+with+Embedded+Jetty). Ayrıca javascript'ten girdiğiniz kimlik bilgilerinin "var auth = base64encode ('name', 'pwd');" olduğunu da görebilirim. Bu, 'ad' için kimlik bilgilerinin 'pwd' olduğu ve ilgili rolle birlikte iskelede bulunması gerektiği anlamına gelir – nibin012

+0

Neden "Yetkilendirme" istek başlığını doğrudan istemci kodunda ayarlıyorsunuz? Neden open() yönteminde kimlik doğrulaması için XmlHttpRequest desteğini kullanmıyorsunuz? Ayrıca, base64encode işlevinizin auth değişkenini "name: pwd" olarak biçimlendirip biçimlendirmediğinden emin değilsiniz. –

+0

Eşzamansız bir istek oluşturuyorsunuz, ancak yanıtı eşzamanlı olarak okumaya çalışıyor musunuz? Bu soruyu gönderirken yaptığınız basitleştirme mi? Değilse, xmlhttp' nesnesinin 'onreadystatechange' özelliğine bir geri arama işlevi atamanız gerekecektir. –

cevap

1

sizin base64encode fonksiyon iki parametre ile ne yapar? Authorization başlık değeri, username:password dizesinin base64 kodlu değeri olmalıdır. (Sütunu not edin.)

Not: Aynı kaynak için XMLHttpRequests, kullanıcı adı ve parolayı open yöntemine parametre olarak sağlayabilirsiniz.