Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur cookie projet java

- An invalid character [32] was present in the Cookie value

7 février 2017 à 10:22:59

Voila ce que j'ai fait 

package pro.servlets;

import java.io.IOException;
import java.net.URLDecoder;

import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.joda.time.*;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;

import pro.beans.Utilisateur;
import pro.forms.ConnexionForm;

public class Connexion extends HttpServlet {
    public static final String  ATT_USER                  = "utilisateur";
    public static final String  ATT_FORM                  = "form";
    public static final String  ATT_INTERVALLE_CONNEXIONS = "intervalleConnexions";
    public static final String  ATT_SESSION_USER          = "sessionUtilisateur";
    public static final String  COOKIE_DERNIERE_CONNEXION = "derniereConnexion";
    public static final String  FORMAT_DATE               = "dd/MM/yyyy HH:mm:ss";
    public static final String  VUE                       = "/WEB-INF/connexion.jsp";
    public static final String  CHAMP_MEMOIRE             = "memoire";
    public static final int     COOKIE_MAX_AGE            = 60 * 60 * 24 * 365;  // 1 an
    

    public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
        /* Tentative de récupération du cookie depuis la requête */
        String derniereConnexion = getCookieValue( request, COOKIE_DERNIERE_CONNEXION );
        /* Si le cookie existe, alors calcul de la durée */
        if ( derniereConnexion != null ) {
            /* Récupération de la date courante */
            DateTime dtCourante = new DateTime();
            /* Récupération de la date présente dans le cookie */
            DateTimeFormatter formatter = DateTimeFormat.forPattern( FORMAT_DATE );
            DateTime dtDerniereConnexion = formatter.parseDateTime( derniereConnexion );
            /* Calcul de la durée de l'intervalle */
            Period periode = new Period( dtDerniereConnexion, dtCourante );
            /* Formatage de la durée de l'intervalle */
            PeriodFormatter periodFormatter = new PeriodFormatterBuilder()
                    .appendYears().appendSuffix( " an ", " ans " )
                    .appendMonths().appendSuffix( " mois " )
                    .appendDays().appendSuffix( " jour ", " jours " )
                    .appendHours().appendSuffix( " heure ", " heures " )
                    .appendMinutes().appendSuffix( " minute ", " minutes " )
                    .appendSeparator( "et " )
                    .appendSeconds().appendSuffix( " seconde", " secondes" )
                    .toFormatter();
            String intervalleConnexions = periodFormatter.print( periode );
            /* Ajout de l'intervalle en tant qu'attribut de la requête */
            request.setAttribute( ATT_INTERVALLE_CONNEXIONS, intervalleConnexions );
        }
        /* Affichage de la page de connexion */
        this.getServletContext().getRequestDispatcher( VUE ).forward( request, response );
    }


    
    public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
        /* Préparation de l'objet formulaire */
        ConnexionForm form = new ConnexionForm();
        /* Traitement de la requête et récupération du bean en résultant */
        Utilisateur utilisateur = form.connecterUtilisateur( request );
        /* Récupération de la session depuis la requête */
        HttpSession session = request.getSession();

        /*
         * Si aucune erreur de validation n'a eu lieu, alors ajout du bean
         * Utilisateur à la session, sinon suppression du bean de la session.
         */
        if ( form.getErreurs().isEmpty() ) {
            session.setAttribute( ATT_SESSION_USER, utilisateur );
        } else {
            session.setAttribute( ATT_SESSION_USER, null );
        }

        /* Si et seulement si la case du formulaire est cochée */
        if ( request.getParameter( CHAMP_MEMOIRE ) != null ) {
            /* Récupération de la date courante */
            DateTime dt = new DateTime();
            /* Formatage de la date et conversion en texte */
            DateTimeFormatter formatter = DateTimeFormat.forPattern( FORMAT_DATE );
            String dateDerniereConnexion = dt.toString( formatter );
            /* Création du cookie, et ajout à la réponse HTTP */
            setCookie( response, COOKIE_DERNIERE_CONNEXION, dateDerniereConnexion, COOKIE_MAX_AGE );
        } else {
            /* Demande de suppression du cookie du navigateur */
            setCookie( response, COOKIE_DERNIERE_CONNEXION, "", 0 );
        }

        /* Stockage du formulaire et du bean dans l'objet request */
        request.setAttribute( ATT_FORM, form );
        request.setAttribute( ATT_USER, utilisateur );

        this.getServletContext().getRequestDispatcher( VUE ).forward( request, response );
    }
    
    private static void setCookie( HttpServletResponse response, String nom, String valeur, int maxAge ) {
    	Cookie cookie = new Cookie(nom, valeur);

        cookie.setMaxAge( maxAge );
        response.addCookie( cookie );
    }
    
    
    /**
     * Méthode utilitaire gérant la récupération de la valeur d'un cookie donné
     * depuis la requête HTTP.
     */
    private static String getCookieValue( HttpServletRequest request, String nom ) {
        Cookie[] cookies = request.getCookies();
        if ( cookies != null ) {
            for ( Cookie cookie : cookies ) {
                if ( cookie != null && nom.equals( cookie.getName() ) ) {
                    return cookie.getValue();
                }
            }
        }
        return null;
    }
    
}

l'erreur qui m'ai retourné est  : An invalid character [32] was present in the Cookie value

j'ai trouver sur internet lors de la creation du cookie

Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));

et a la lecture du cookie faire 

String value = URLDecoder.decode(cookie.getValue(), "UTF-8");

mais cela ne fonctionne pas 

et je suis sous tomcat v9.0

merci a vous 



-
Edité par antoinefrancois95 7 février 2017 à 14:56:55

  • Partager sur Facebook
  • Partager sur Twitter
7 février 2017 à 13:09:50

Bonjour,

Peut tu éditer ton premier message, pour que l'on puisse comprendre ce que tu a fait, ce que tu a trouver sur internet et l'erreur sans que l'on doivent chercher dans le sous-titre.

Merci :)

  • Partager sur Facebook
  • Partager sur Twitter
7 février 2017 à 16:19:01

Essaye de modifier ton format de date en enlevant les "/" et les "-"
  • Partager sur Facebook
  • Partager sur Twitter
7 février 2017 à 16:24:46

ne change rien :/

-
Edité par antoinefrancois95 7 février 2017 à 16:38:21

  • Partager sur Facebook
  • Partager sur Twitter
7 février 2017 à 16:35:02

Les supprimé pour voir si cela vient de là ou pas.
  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2017 à 17:28:25

Bonjour je débute en Java EE et j'ai exactement la même erreur, je ne sais pas si tu as une solution. Je pense avoir trouvé des infos à ce sujet ici et

Si j'ai bien compris cela serait dû - à partir des versions 8+ de Tomcat - à une implémentation de la classe org.apache.tomcat.util.http.Rfc6265CookieProcessor en lieu et place de org.apache.tomcat.util.http.LegacyCookieProcessor, la première étant plus restrictive au niveau des caractères utilisés que la seconde...

Un des deux liens cités plus haut suggère de changer la propriété cookieProcessor en écrivant dans un fichier context.xml la ligne suivante :

<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />

Du coup, je me pose les questions sont les suivantes :

  • Est-ce la bonne solution ?
  • Où trouver ce fichier context.xml ?

Merci pour votre aide.

  • Partager sur Facebook
  • Partager sur Twitter
19 mars 2017 à 13:52:47

J'ai eu le même problème! Merci supertomator la solution d'édition du fichier "context.xml" du serveur Tomcat fonctionne parfaitement pour moi!

Le fichier "context.xml" se trouve sous Eclipse dans le dossier "Servers"  :

Il suffit d'y ajouter la ligne : <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />

Penser à redémarrer Tomcat pour tester !

-
Edité par AnthoNy3 19 mars 2017 à 13:56:53

  • Partager sur Facebook
  • Partager sur Twitter
28 mars 2017 à 11:14:44

Bonjour Anthony, merci pour l'info, je vais tester ça !
  • Partager sur Facebook
  • Partager sur Twitter
12 juillet 2017 à 18:35:01

Bonjour,

Me trouvant avec le même problème que antoinefrancois95, je suis aussi sur Tomcat 9, j'ai su résoudre le problème avec les solutions suivante :

Pour ce qui est du setCookie

/* Changer */

Cookie cookie = new Cookie( nom, valeur );

/* Par ceci */

Cookie cookie = new Cookie( nom, URLEncoder.encode( valeur, "UTF-8" ) );

Pour le getCookie

/* Changer */

return cookie.getValue();

/* Par ceci */

return URLDecoder.decode( cookie.getValue(), "UTF-8" );


Je ne sais pas si c'est une bonne solution...

Par contre dans ma console "Réseau" je trouve ceci :

au lieu de :

le format date n'est vraiment pas la même, mais sans l'encodage UTF-8 par URLDecoder et URLEncoder j'ai l'Erreur suivante :


Si il y a une solution plus propre je suis preneur :)

Merci pour vos réponse.

Mister T

  • Partager sur Facebook
  • Partager sur Twitter
24 octobre 2017 à 18:55:09

Merci superTomator et AnthoNy3 ça fonctionne parfaitement sur Tomcat v8.5
  • Partager sur Facebook
  • Partager sur Twitter
19 avril 2020 à 12:37:27 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


3 septembre 2020 à 0:37:45

Merci beaucoup @supertomator (pour la documentation)et @AnthoNy3 (pour la précision du fichier context.xml dans server). La solution marche très bien.
  • Partager sur Facebook
  • Partager sur Twitter
MBALLO
3 septembre 2020 à 9:57:25

@HamadouMballo Bonjour, pour dire merci pas la peine de déterrer un sujet, vous avez la possibilité de cliquer sur les pouces levés des messages qui vous ont aidés.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter