Question

Je suis en train de connecter le contenu des attributs HttpServletRequest collection. Je dois le faire lorsque le servlet démarre, et à nouveau juste avant la servlet est terminée. Je fais cela pour tenter de comprendre un crufty et servlet mal entretenu. Parce que je dois avoir que peu d'impact possible, les filtres de servlet ne sont pas une option.

Alors, voici le problème. Lorsque le servlet commence, je vais itérer l'énumération renvoyée par HttpServletRequest.getAttributeNames (). Cependant, quand je veux itérer à travers elle à nouveau, getAttributeNames (). Les rendements hasMoreElements () « faux »! Je ne peux pas trouver un moyen de « remise à zéro » l'énumération. Ce qui est pire est que, même si j'ajouter des attributs à la collection en utilisant HttpServletRequest.setAttribute (), je reçois toujours un résultat de « faux » quand je l'appelle getAttributeNames (). HasMoreElements ().

Est-ce vraiment possible? Est-il vraiment aucun moyen pour parcourir les noms d'attributs plus d'une fois?

Sur demande, voici mon code. Il est assez simple -. Ne pense pas que je fais une substance drôle

/**
 * 
 * Returns the contents of the Attributes collection, formatted for the InterfaceTracker loglines
 * 
 */
@SuppressWarnings("unchecked")
public static String getAttributes(HttpServletRequest request) {
    try {       
        StringBuilder toLog = new StringBuilder();  

        Enumeration attributeNames = request.getAttributeNames();           

        while(attributeNames.hasMoreElements()) {
            String current = (String) attributeNames.nextElement();

            toLog.append(current + "=" + request.getAttribute(current));            

            if(attributeNames.hasMoreElements()) {
                toLog.append(", ");
            }           
        }       

        return "TRACKER_ATTRIBUTES={"+ toLog.toString() + "}";
    }
    catch (Exception ex) {
        return "TRACKER_ATTRIBUTES={" + InterfaceTrackerValues.DATA_UNKNOWN_EXCEPTION_THROWN + "}";
    }               
}
Était-ce utile?

La solution

Peut-être que vous devez envoyer le code où vous appelez HttpServletRequest.setAttribute().

À ce stade, il semble que votre crufty et servlet mal entretenu est la suppression des attributs entre vos deux appels à getAttributeNames(), mais sans exemples de code, il est difficile de dire.

UPDATE

Rien dans votre code saute sur moi comme défectueux ... donc je Crafted un cas de test extrêmement simple à l'intérieur handleRequest() et lui a donné un tourbillon (en utilisant jboss-pae-4.3 comme mon conteneur). Je devais définir manuellement un attribut d'abord, comme ma compréhension de la demande attributs est qu'ils sont toujours définis côté serveur (si je ne l'ai pas mis alors je n'a pas obtenu de sortie comme le Enumeration retourné par getAttributeNames() était vide).

request.setAttribute("muckingwattrs", "Strange");

Enumeration attrs =  request.getAttributeNames();
while(attrs.hasMoreElements()) {
    System.out.println(attrs.nextElement());
}

System.out.println("----------------------------");

Enumeration attrs2 =  request.getAttributeNames();
while(attrs2.hasMoreElements()) {
    System.out.println(attrs2.nextElement());
}

output

INFO  [STDOUT] muckingwattrs
INFO  [STDOUT] ----------------------------
INFO  [STDOUT] muckingwattrs

Alors peut-être votre conteneur ne met pas en œuvre correctement getAttributeNames()? Peut-être essayer un cas de test extrêmement simple comme le mien directement dans handleRequest() ou doGet()/doPost().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top