En fonction du formulaire d'Authentification à l'aide de HttpClient - j_security_check
J'essaie d'authentifier moi-même un site web qui emploie la forme d'authentification (par exemple, facebook.com) à l'aide de l'Apache HttpClient bibliothèque Java.
En utilisant le présent site web du programme comme principal exemple: http://www.elitejavacoder.com/2013/10/http-client-form-based-authentication.html, j'ai été en mesure de le faire - mais il y a quelques choses que je ne comprends pas à propos de ce programme. Voici le code:
package com.elitejavacoder.http.client;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class HttpClientFormAuthentication {
public static void main(String[] agrs) {
String host = "yourhostname.com";
int port = 8080;
String protocol = "http";
DefaultHttpClient client = new DefaultHttpClient();
try {
HttpHost httpHost = new HttpHost(host, port, protocol);
client.getParams().setParameter(ClientPNames.DEFAULT_HOST, httpHost);
HttpGet securedResource = new HttpGet("/secured/index.jsp");
HttpResponse httpResponse = client.execute(securedResource);
HttpEntity responseEntity = httpResponse.getEntity();
String strResponse = EntityUtils.toString(responseEntity);
int statusCode = httpResponse.getStatusLine().getStatusCode();
EntityUtils.consume(responseEntity);
System.out.println("Http status code for Unauthenticated Request: " + statusCode);//Statue code should be 200
System.out.println("Response for Unauthenticated Request: \n" + strResponse); //Should be login page
System.out.println("================================================================\n");
HttpPost authpost = new HttpPost("/j_security_check");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("j_username", "yourusername"));
nameValuePairs.add(new BasicNameValuePair("j_password", "yourpassword"));
authpost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
httpResponse = client.execute(authpost);
responseEntity = httpResponse.getEntity();
strResponse = EntityUtils.toString(responseEntity);
statusCode = httpResponse.getStatusLine().getStatusCode();
EntityUtils.consume(responseEntity);
System.out.println("Http status code for Authenticattion Request: " + statusCode);//Status code should be 302
System.out.println("Response for Authenticattion Request: \n" + strResponse); //Should be blank string
System.out.println("================================================================\n");
httpResponse = client.execute(securedResource);
responseEntity = httpResponse.getEntity();
strResponse = EntityUtils.toString(responseEntity);
statusCode = httpResponse.getStatusLine().getStatusCode();
EntityUtils.consume(responseEntity);
System.out.println("Http status code for Authenticated Request: " + statusCode);//Status code should be 200
System.out.println("Response for Authenticated Request: \n" + strResponse);//Should be actual page
System.out.println("================================================================\n");
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
J'ai les questions suivantes (les numéros de ligne, je vais me référer à sont dans le contexte du lien que j'ai fourni ci-dessus, depuis StackOverflow ne permettent pas d'inclure les numéros de ligne):
-
Ce qui est exactement "/j_security_check" (ligne 41)? Et comment l'auteur savait qu'il devait utiliser "j_security_check" au lieu du nom de la ressource sécurisée?
-
Comment se fait que la chaîne "strResponse = EntityUtils.toString(responseEntity);" (ligne 49), ce qui est deux lignes après "httpResponse = client.execute(authpost);" (ligne 47), est différente de la chaîne "strResponse = EntityUtils.toString(responseEntity);" (ligne 59), qui est de deux lignes après "httpResponse = client.execute(securedResource);" (ligne 57)?
Fondamentalement, ce que des changements se produire au "client" entre les lignes 47 et 57?
Merci
OriginalL'auteur user224567893 | 2014-06-27
Vous devez vous connecter pour publier un commentaire.
La
/j_security_check
est une forme d'action, de sorte que le conteneur sait que cette demande est pour l'authentification et le conteneur des poignées./j_security_check
est une adresse de page web pour la soumission des formulaires d'authentification qui est spécifique à l'Entreprise les serveurs d'applications Java.j_username
etj_password
sont les noms des paramètres de la requête à présenter à la fois le nom d'utilisateur et mot de passe. Ces trois éléments devraient être nommés de manière (c'est à direj_security_check
,j_username
etj_password
) de sorte que le conteneur gère cette demande comme une demande d'authentification et il peut extraire les informations nécessaires (c'est à dire nom d'utilisateur et mot de passe) à partir de la demande présentée.L'auteur savait qu'il/elle a besoin pour utilisé
/j_security_check
parce qu'il/elle est en supposant qu'il authentifie avec un J2EE, serveur d'application. Ce n'est pas une bonne hypothèse. Notez que le port est situé à l'8080? C'est le port généralement utilisé par Java serveurs Tomcat afin qu'ils n'entrent pas en collision avec le port 80 d'un serveur HTTP.strResponse
à la ligne 47 contient le contenu de la demande de connexion elle-même (qui n'est rien), etstrResponse
à la ligne 57 contient le contenu de la page sécurisée. C'est la rupture:La suite arriverait-il si vous faisiez cela dans un navigateur web.
La ligne 31 est la première page d'accès sans authentification.
Lignes 38-39 d'afficher le formulaire de connexion,
Lignes 41-45 sont l'équivalent de la saisie de votre nom d'utilisateur et le mot de passe dans un formulaire.
Ligne 47 est comme le fait de frapper le bouton "Soumettre".
49 ligne est en montrant ce que le serveur a envoyé en réponse. Avis à la ligne 54 le commentaire est "Devrait être la chaîne vide". Lorsque vous soumettez le nom d'utilisateur et le mot de passe, ce qui vous préoccupent le plus en la réponse est le code d'état HTTP. Le commentaire de la ligne qui affiche le code d'état indique "code d'État doit être 302". 302 est le statut HTTP qui indique au navigateur de redirection. Les en-têtes de réponse devrait contenir une adresse de votre navigateur pour rediriger vers. Les en-têtes de réponse également contenir le cookie d'authentification. Ce serait bien si c'était imprimé trop, il serait utile de comprendre comment tout cela fonctionne. Le code manuellement la redirection sur la ligne 57, mais il est à supposer qu'il soit redirigé vers la page sécurisée, il a essayé d'accéder à la ligne 31, plutôt que de récupérer l'adresse de l'-têtes de réponse HTTP.
Le plus grand changement à
client
est que par la ligne 57client
a le cookie d'authentification, semblable à l'explorateur. DefaultHttpClient gère pour vous sous le capot.Le cookie d'authentification est livré à partir du serveur sous la forme d'un Set-Cookie en-tête HTTP. Ceci dit l'
client
à stocker le cookie. Puis, lors d'une demande, le client envoie un Cookie en-tête HTTP, ainsi que les données de cookie.La
client
reçoit d'abord le cookie sur la réponse qui contient le formulaire de connexion, qu'il stocke. Lorsque leclient
de renvoyer le formulaire rempli, le cookie est également inclus dans la demande, et chaque requête au serveur par la suite. Une fois que vous avez authentifié, le serveur stocke l'information et l'associe avec le cookie. Puis, lorsque les demandes de laclient
, le serveur voit le cookie et se souvient que vous avez déjà authentifié. Leclient
n'a tout de même des choses un navigateur pour gérer les cookies de transfert de données avec le serveur.OriginalL'auteur user224567893
"/J_security_check" est le terme utilisé par le Framework Spring pour vérifier les informations d'identification utilisateur (vous pouvez trouver l'information ici: http://docs.spring.io/spring-security/site/docs/3.2.4.RELEASE/reference/htmlsingle/#form-login-filter, le point de terminaison par défaut est "/j_spring_security_check").
L'auteur savait qu'il/elle a eu à utiliser cette URL, car il/elle avait mis l'URL dans le Cadre du Printemps de la configuration (elle est définie dans l'élément, pour définir l'URL que vous avez à modifier le "login-traitement-" url de l'attribut).
Entre les lignes 47 et 57 le client a été redirigé vers une autre URL et a récupéré cette URL. L'URL vers laquelle le client doit être redirigée est défini par le "défaut-cible" url de l'attribut. Notez que le Printemps peut aussi rediriger un utilisateur vers l'URL, il/elle demandé avant la page de connexion s'affiche.
client
entre les lignes 47 et 57? Parce que si je créé un nouveauDefaultHttpClient
(direclient 2
) objet juste avant la ligne 57 (avec tout le bon hôte, le port, etc.), et appeléhttpResponse = client2.execute(securedResource);
à l'aide declient2
, le résultat de l'entité de la ligne 58 et la chaîne de résultat de la ligne 59 serait différente de celle que je viens d'appeler toutes ces méthodes avecclient
. Il se passe quelque chose àclient
après la ligne 47 est exécuté, qu'il est fait de sorte que vous pouvez obtenir la ressource sécurisée en ligne 57.OriginalL'auteur Bartosz Mikulski