Validation formulaire avec JCaptcha

Fermé
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 - 11 juil. 2008 à 12:17
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 - 18 juil. 2008 à 16:29
Bonjour à tous,
je fais un site web en java/j2ee, ftl, bsh et javascript et pour la validation d'un formulaire, je souhaiterais utiliser le principe de Captcha mais en java donc JCaptcha.
Cependant, à part sur le site en lui même, je n'ai pas trouvé de tutoriels ou d'exemple en JCaptcha.
Si certains ont des infos ou on déjà utilisé ce genre d'applications, je suis preneur.
Merci d'avance

9 réponses

Bah g suivi ce qui a ecrit là...

http://forge.octo.com/jcaptcha/confluence/display/general/5+minutes+application+integration+tutorial


et çà marche du premier coup.... explique ton pb avec si tas cor un soucis.
1
Oui j'ai le même soucis,
à savoir comment afficher le captcha dans un fichier freemarker .ftl
donc si kelkun a un exemple basique à refiler ou un tutoriel....
voilà, merci.
0
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 3
17 juil. 2008 à 12:20
Salut, j'ai reussi à afficher l'image :
J'ai laissé tombé SimpleCaptcha après avoir ecrit au createur du framework car il m'a repondu que ce n'etait pas stable et qu'il valait mieux utilisé Kaptcha qui fonctionne avec jdk 1.5 (moi obligé d'avoir la 1.4)
Donc j'ai utilisé Jcaptcha .
Je n'ai rien mis dans mon web.xml car j'ai un fichier controller.xml qui redirige mes pages.
J'ai cassé ma servlet ImageCaptchaServlet pour une classe java normale qui me retourne "succes" ou "error"...
Et j'ai mon image
Maintenant, la où je reflechie, c'est comment recuperer la valeur de mon image pour la comparer avec ceux que je rentre......et je veux valider mon formulaire avec un javascript !!
J'ai trouvé ca mais bon :
String response = httpServletRequest.getParameter("j_captcha_response");

Si quelqu'un à une idée ?
0
je regarde ca apres manger X}
0
pour vérifier que le code entré et le bon faut faire:
try {
isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,
response);
} catch (CaptchaServiceException e) {
//should not happen, may be thrown if the id is not valid
}

En javascript tu peux pas bien sûr ,il faudrait mettre dans la page le code à trouver ce ki ne serait pas bon puisque qu'il serait accessible aux pirates et non annulerait linteret du captcha et en plus je sais meme pas la méthode pour obtenir le bon code (si yen a une)

Pour valider en direct il te faudrait faire un truc en ajax qui enverrait une requete à une servlet
qui contiendrait le bout de code d'au dessus je pense.

pareil pour regenerer un captcha au cas ou le courant est illisble faire un truc en ajax.
:-/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 3
17 juil. 2008 à 15:32
Dans le formulaire, dans ma fonction javascript, je ne sais pas comment récuperer la valeur de mon image !

Dans ma FTL :

<form name="fTellAFriend" id="fTellAFriend" action="/emailFriend">
<input type="text" name="imageText" maxlength="6"/></td>
Image : <img src="/jcaptcha" width="150" height="75" >

<input type="button" value="${yrLabelMap.valid}" onclick="return validateTAF('${recipientNumber}','${largeImageUrl}');"/><

</form>


Et en javascript :
function validateTAF(recipientNumber, productImage)
{
var form = document.getElementById("fTellAFriend");

var imageText= form.imageText.value;

return new AJAXRequest("post", "/control/doTellAFriend/", params, processTellAFriend);

}

avec d'autres fonctions dans mon javascript mais je cherche à recuperer surtout la valeur de mon image Captcha.
0
pourquoi recuperer la valeur de limage Captcha?? ca veut dire koi??

normalement tu dois sauvergarder en session le captchaID qui a servi lors de la création de l'image.
avec ca et la response entré dans le formulaire tu as tout ce kil faut pour vérifier grace à la méthode
captchaService.validateResponseForID.
donc tu envoie juste dans ton post ajax ce ka taper lutilisateur,
nan?
0
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 3 > toto62
17 juil. 2008 à 15:49
Ok, je vais tester !!!
MErci
0
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 3
17 juil. 2008 à 16:06
J'ai testé :

Boolean isResponseCorrect =Boolean.FALSE;
String captchaId = httpServletRequest.getSession().getId();
String response = httpServletRequest.getParameter("imageTexte");

try {
isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId, response);
} catch (CaptchaServiceException e) {

}


ok dans ma reponse, j'ai bien passé la valeur que j'ai rentré dans mon INPUT......mais le captchaId, je ne vois pas l'interet puisque ca ne correspond pas à ma response:
exemple :
contenu de response :asbef
contenu de captchaId :F49239A43FBF6489366DC48AFCBEBC5C.jvm1

Quel est l'interet de cette methode validateResponseForID ?
0
bah cette méthode te dit si oui ou non le code tapé par l'utilisateur correspond bien à limage généree avec cette ID;

Bon ca cé en théorie car elle pas bien chez moi jai l'exception invalid id kié levée ARghhh
(toi ca te le fait???)

sinon je ne sais pas si tu peux directement obtenir la phrase de limage et le comparer avec la saisie du formulaire ce qui serait plus simple :-/
0
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 3 > toto62
17 juil. 2008 à 16:45
Pour ma part, si je passe NUL en captchaId, ca ne plante pas et ca ne me leve pas d'exception ! Donc c'est pour ca que je pose cette question !
En effet, le mieux pour moi serait de recuperer directement le texte de l'image et le comparer avec le texte saisi par l'utilisateur !
Je cherche mais la , je seche !
0
toto62 > silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008
17 juil. 2008 à 18:27
bah je pense pas kon puisse faire de ette manière sinon moi ca marche,
avant ca marchait pas car mon captchaservice etait pas vraiment un singleton mais mainteant c bon.

je genere un captchaID que je stocke en session
et je genere une image avec.

Quand je recois la saisie de lutilsateur japplique la methode
validateResponseForID(captchaI,reponse) et ca marche nickel
0
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 3 > toto62
17 juil. 2008 à 18:35
Tu dis :
"je genere un captchaID que je stocke en session
et je genere une image avec."

Comment fais tu ?

Moi j'ai fait une classe Java (ce n'est pas un singleton) :

public static String doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {

byte[] captchaChallengeAsJpeg = null;
// the output stream to render the captcha image as jpeg into
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
// get the session id that will identify the generated captcha.
//the same id must be used to validate the response, the session id is a good candidate!
String captchaId = httpServletRequest.getSession().getId();

// call the ImageCaptchaService getChallenge method
BufferedImage challenge =
CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,
httpServletRequest.getLocale());
// a jpeg encoder
JPEGImageEncoder jpegEncoder =
JPEGCodec.createJPEGEncoder(jpegOutputStream);
jpegEncoder.encode(challenge);
} catch (IllegalArgumentException e) {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
return "error";
} catch (CaptchaServiceException e) {
httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return "error";
}

captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
// flush it in the response
httpServletResponse.setHeader("Cache-Control", "no-store");
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setDateHeader("Expires", 0);
httpServletResponse.setContentType("image/jpeg");
ServletOutputStream responseOutputStream =
httpServletResponse.getOutputStream();
responseOutputStream.write(captchaChallengeAsJpeg);
responseOutputStream.flush();
responseOutputStream.close();
return "success";
}

Ma ftl :

<input type="text" name="imageText" maxlength="6"/>
<img id="imageCaptcha" name="imageCaptcha" src="/jcaptcha" >


Et ensuite, je fais normalement :

Boolean isResponseCorrect =Boolean.FALSE;
//remenber that we need an id to validate!
String captchaId = request.getSession().getId();
//retrieve the response
String responseCaptcha= request.getParameter("imageText");


// Call the Service method
try {
isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,responseCaptcha);
} catch (CaptchaServiceException e) {
//should not happen, may be thrown if the id is not valid
}

Mais si je met ici :
isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,null);
Ca ne plante même pas !
:-(
0
bah si tas classe captchaservice est bien un singleton
et que l'id utilisé:
String captchaId = httpServletRequest.getSession().getId();
est bien le même (vérifie en laffichant).

ca devrait marché ss probleme.
tu ten fous si ca plante pas avec null, à la place de null mets le String saisi par l'utilsateur
et le booleen isReponseCorrect sera a true si il cé pas gouré.

dans le catch tu peux gerer le fait que les id different ou tout autre erreur et affiché ce ki faut.

jespere que tu vas y arriver! :)
0
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 3
18 juil. 2008 à 09:29
Ouais mais si je saisi un texte ne correspondant pas à l'image , ca marche quand même !
0
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 3
18 juil. 2008 à 11:36
Ok, c'est bon ca marche !!!
As tu constaté que lors d'une erreur, il ne rechargeait pas l'image Captcha et quand tu refaissais une tentative, il y avait une erreur CaptchaServiceExcpetion :
Invalid ID, could not validate unexisting or already validated captcha
0
heu non... cé ptete parce que ton navigateur rafraichit pas la page ou une histoire comme çà???

là je peux pas tester car g merdé avec SVN et g perdu le boulot de ces derniers jours fo que je recupere tt dans lhistory ou que je refasse ..... X-S
0
silverfab34 Messages postés 33 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 18 juillet 2008 3 > toto62
18 juil. 2008 à 16:29
Bon courage pour remettre tout en etat !!!
Pour le moment, la fonctionnalité de mon catpcha fonctionne :

Et pour rafraichir le captcha à chaque fois, dans mon form j'ai fait un onload qui appelle ma fonction :

function update_img() {
theImage = new Image;
theImage.src = "/control/jcaptcha?"+(new Date()).getTime();
document.getElementById("imageCaptcha").src = theImage.src;
}

En gros pour le moment, ca marche !!
Le souci vient ensuite de l'affichage quand le texte entré par l'utilisateur ne correspond pas à celui de l'image....j'ai un problème dans le chargement de mon formulaire mais bon.....ce que je voulais fonctionne !!
Merci pour ton aide, bon courage pour récupérer tout tes projets et bon WE !
0