11484 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
Un script tout simple me permet de demander un mot de passe et d'ouvrir le fichier "motdepasse"+".html".


function AccesProtege() {self.location.href=prompt("Mot de passe :","") + ".html";}


Mais si je me trompe, apparait l'erreur 404 !
Cet autre script permet de vérifier si un fichier existe :

import java.io.*;
class VerifierExistenceFichier {
    public static void main(String args[]) {
        String nomFichier = "quelquechose.txt";
        File fichier;
        fichier = new File(nomFichier);
        if (fichier.exists()) {
            System.out.println("Le fichier existe");
        } else {
            System.out.println("Le fichier n'existe pas");
        }
    }
}


Et bien , voyez-vous, je suis incapable de mélanger les deux, par méconnaissance du langage.
Pourriez-vous le faire, SVP ?
En cas d'erreur, il faudrait ouvrir le fichier "erreur.html".

Merci infiniment !
Gérard
Modifié par _laurent (22 Feb 2021 - 18:37)
C'est gentil comar91 !
Je ne comprend même pas votre réponse (try/catch).
Alors, même traduite par Google, la page proposée ne m’éclaire pas.
Je n'ai pas réussi à trouver de liste "fonctions?" comme en html ou css, ce qui permet de mettre en place des tests et d'avancer !
En JavaScript c'est plus compliqué et, semble-t-il, réservé à des connaisseurs.
Merci encore, d'avoir essayé !
Bon alors
function AccesProtege() {
try {
self.location.href=prompt("Mot de passe :","") + ".html";
} catch (error) {
// Traitement fichier non trouvé
}

Modifié par comar91 (22 Feb 2021 - 19:40)
Merci !
Mais ça ne marche pas !
Il apparait en bas de la page "javascript:AccesProtege()" lorsque je clique sur "mot de passe"

Voici mon script :
<SCRIPT>
function AccesProtege() {
try {
self.location.href=prompt("Mot de passe :","") + ".html";
} catch (error) {
// Traitement fichier non trouvé (J'ai essayé windows.location="erreur.html";)
}
</SCRIPT>

Dans le body apparait aussi :
<a href="#">COPROPRIETAIRES :&nbsp;<a HREF="javascript:AccesProtege()"> mot de passe</a>

Peut-être une toute petite erreur de syntaxe que je suis incapable de retrouver...
Encore merci !
Modifié par saxobleu (23 Feb 2021 - 15:18)
J'ai trouvé l'erreur de syntaxe : j'ai rajouté un "}" à la fin du script.
Mais ça ne marche toujours pas, en cas de mot de passe erroné !

Apparemment, le fait que le fichier "motdepasseerroné"+".html" n'existe pas n'est pas testé.

Merci
Bonjour, tu as raison cela ne va pas. Je te propose de passer par un appel ajax. Code js:
function existFich(nom){
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4) {
			if (xhttp.status == 404) {
				ret = 'KO';
			}
			ret = 'OK';
		}
	}
  xhttp.open('GET', nom, false);
  xhttp.send();
}
function AccesProtege() {
	let mdp = prompt('Mot de passe :');
	let nom = path + '/' + mdp + '.html';
	existFich(nom);
	if (ret == 'OK') {
	// Traitement OK
		self.location.href=nom;
	} else {
// Traitement KO
		alert ('Non trouvé: '+nom);
	}
}
var uri = document.baseURI;
var n = uri.lastIndexOf('/');
var path = uri.substr(0, n);
var ret = '';
Erreur de ma part : ça ne marche pas sur l'ordi !
Une fois sur le serveur, le système fonctionne, sauf la recherche de l'existence du fichier.
Il renvoie bien "motdepasseerroné" + ".html" = erreur 404, sans vérifier s'il existe.

Donc toujours pas de solution...
Modérateur
Bonjour,

comar91 a écrit :
Je te propose de passer par un appel ajax


Ton code ne peut pas fonctionner.

La requête ajax est exécutée en différée. Du coup, quand tu testes la valeur de ret dans la fonction AccesProtege(), elle n'a pas encore eu le temps de recevoir la valeur déterminée par la requête ajax.

Il faut déplacer
if (ret == 'OK') {
	// Traitement OK
		self.location.href=nom;
	} else {
// Traitement KO
		alert ('Non trouvé: '+nom);
	}

dans le code de xhttp.onreadystatechange.

EDIT: en plus de ça, ton code contient des erreurs. Tel quel, ret vaut toujours "OK".

EDIT 2: de plus, ça m'étonnerait que ça marche chez free. Leurs serveurs ne renvoient pas d'erreur 404 si le fichier n'existe pas me semble-t-il. Pour bien faire, il faudrait que la requête ajax déclenche un script php qui teste l'existence du fichier.

Amicalement,
Modifié par parsimonhi (24 Feb 2021 - 09:22)
Bonjour parsimonhi, tu as raison je n'ai pas tout testé hier donc le KO/ OK ... Par contre je ne comprends pas "La requête ajax est exécutée en différée." --> J'ai codé xhttp.open('GET', nom, false); ? Donc l'appel se fait en synchrone ? pour le script php, je suis d'accord avec toi je ne l'ai pas proposé puisque le problème évoqué était en JS.
PS, sous free ils renvoient bien 404 ? C'est dans la norme HTTP ?

Amicalement,
Marc
Modifié par comar91 (24 Feb 2021 - 10:47)
Modérateur
Bonjour,

@comar91

Ok, si tu le forces à être synchrone, peut-être. Mais de toute façon, c'est mieux de faire le traitement complémentaire dans la fonction existFich().

Chez free, j'ai un site qui renvoie toujours un code 200 et pas 404 dans les requêtes ajax. Du coup, la méthode n'y marche pas.

Et puis il manque un else dans le code de xhttp.onreadystatechange que tu proposes.

Une solution avec un fichier php complémentaire (pour contourner le problème des serveurs de chez free) :

1) le script js
function existFich(nom){
	var xhttp = new XMLHttpRequest();
	xhttp.onreadystatechange = function() {
		if (xhttp.readyState == 4) {
			if (xhttp.response == 'OK') {
				// Traitement OK
				self.location.href=nom;
			} else {
				// Traitement KO
				self.location.href="erreur.html";
			}
		}
	};
	xhttp.open('POST', "existFich.php");
	xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhttp.send('nom='+encodeURIComponent(nom));
}
function AccesProtege()
{
	let mdp = prompt('Mot de passe :');
	let nom = mdp + '.html';
	existFich(nom);
}

2) il faut créer le script php suivant, et l'appeler existFich.php
<?php
if(isset($_POST['nom']))
{
	if(file_exists($_POST['nom'])) echo "OK";
	else echo "NOK1";
}
else echo "NOK2";
?>

EDIT: suppression de la ligne var ret = ''; dans le code js (elle ne sert plus à rien).

Amicalement,
Modifié par parsimonhi (24 Feb 2021 - 11:39)
Meilleure solution
Bonjour,
@parsimonhi "Et puis il manque un else dans le code de xhttp.onreadystatechange que tu proposes." --> j'avais compris il me semble que j'ai fait mon mea culpa non ? Pour free donc quand tu appelles en direct une ressource non existante on a bien 404 mais pas via ajax c'est ça ? C'est tout de même étonnant non ?
Amicalement,
Marc
Merci parsimonhi et merci comar91

Le dernier script fonctionne sur le serveur !
La seule différence est qu'en cas d'annulation, il renvoie erreur de fichier.

C'est exactement ce que je voulais !

J'ai un mot de passe inviolable (facilement) parce qu'il n'apparait nulle part.
Il me reste à protéger l'accès aux fichiers de mon site.

Merci infiniment
Modérateur
Bonjour,

comar91 a écrit :
@parsimonhi "Et puis il manque un else dans le code de xhttp.onreadystatechange que tu proposes." --> j'avais compris il me semble que j'ai fait mon mea culpa non ?

Oui, oui, désolé, j'avais lu trop vite ta réponse. Smiley cligne

comar91 a écrit :
Pour free donc quand tu appelles en direct une ressource non existante on a bien 404 mais pas via ajax c'est ça ? C'est tout de même étonnant non ?

Oui, c'est ça et oui, c'est étonnant, mais ce n'est pas si rare que ça.

EDIT: ou plutôt, on a bien un mécanisme général renvoyant vers la page d'erreur 404 dans tout les cas, mais le code de retour est lui à 200.

Les administrateurs système ont plus d'un tour dans leur sac qui souvent n'aident pas. Smiley lol Smiley lol Smiley lol

Amicalement,
Modifié par parsimonhi (24 Feb 2021 - 11:50)
Même après 1heure, ça marche toujours !
Merci
Sujet résolu et potentiellement publiable, pour résoudre la problématique des mots de passe !