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()});
}
//...
}
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
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". –
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'. –