2010-10-26 7 views
15

Tener un servidor Jetty configurado programáticamente al cual intento acceder mediante ajax y xmlHttpRequest. Sin autorización, la llamada funciona bien pero con, obtengo 401 no autorizado. Cualquier sugerencia.Jetty, Preflight y ajax

Javascript llamada se parece a esto (acortada):

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

código de servidor se parece a esto (aún más corto)

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

Supongo que esto te será útil [1]. (Http://docs.codehaus.org/display/JETTY/How+to+Configure+Security+with+Embedded+Jetty). También puedo ver que las credenciales que está ingresando desde javascript es "var auth = base64encode ('nombre', 'pwd');". Eso significa que las credenciales para 'nombre' es 'pwd' y debe estar presente en el embarcadero con la función relevante – nibin012

+0

¿Por qué establece el encabezado de la solicitud "Autorización" en el código del cliente directamente? ¿Por qué no utilizar el soporte XmlHttpRequest para la autenticación en el método open()? Además, no estoy seguro de si la función base64encode formatea la variable auth como "nombre: pwd". –

+0

Parece que está realizando una solicitud asíncrona, pero ¿intenta leer la respuesta de forma sincrónica? ¿Es solo una simplificación que hiciste al publicar esta pregunta? De lo contrario, deberá asignar una función de devolución de llamada a la propiedad 'onreadystatechange' del objeto' xmlhttp'. –

Respuesta

1

¿Qué hace su función base64encode con los dos parámetros? El valor del encabezado Authorization debe ser el valor codificado en base64 de la cadena username:password. (Tenga en cuenta los dos puntos)

Nota: para el mismo origen XMLHttpRequests, puede proporcionar el nombre de usuario y la contraseña como un parámetro para el método open.

0

El encabezado de autorización debe ser similar al siguiente ejemplo:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

Cuando el texto que aparece después de "básico" es una codificación base64 de:

Comprobar este enlace para más información: http://en.wikipedia.org/wiki/Basic_access_authentication