2010-02-03 18 views
1

J'ai un filtre qui prend une requête entrante, puis l'enveloppe avec un HttpServletRequestWrapper, qui à son tour a une méthode setParameter(). Toutefois, cela ne fonctionnera plus maintenant dans les servlets filtrés:jsp: param ne définit plus de paramètres lorsque la requête d'origine est enveloppée avec un HttpServletRequestWrapper

<jsp:include page="testing-include.jsp"> 
    <jsp:param name="testing" value="testing" /> 
</jsp:include> 

Ils incluent la page ne prendra pas le paramètre de demande. Si je supprime le filtre et que la demande non modifiée d'origine est envoyée (déballée) au servlet, cela fonctionne à nouveau. Voici mon emballage:

public class HttpServletModifiedRequestWrapper extends HttpServletRequestWrapper { 

    Map parameters; 

    @SuppressWarnings("unchecked") 
    public HttpServletModifiedRequestWrapper(HttpServletRequest httpServletRequest) { 
     super(httpServletRequest); 
     parameters = new HashMap(httpServletRequest.getParameterMap()); 
    } 

    public String getParameter(String name) { 
     String returnValue = null; 
     String[] paramArray = getParameterValues(name); 
     if (paramArray != null && paramArray.length > 0){ 
      returnValue = paramArray[0]; 
     } 
     return returnValue; 
    } 

    @SuppressWarnings("unchecked") 
    public Map getParameterMap() { 
     return Collections.unmodifiableMap(parameters); 
    } 

    @SuppressWarnings("unchecked") 
    public Enumeration getParameterNames() { 
     return Collections.enumeration(parameters.keySet()); 
    } 

    public String[] getParameterValues(String name) { 
     String[] result = null; 
     String[] temp = (String[]) parameters.get(name); 
     if (temp != null){ 
      result = new String[temp.length]; 
      System.arraycopy(temp, 0, result, 0, temp.length); 
     } 
     return result; 
    } 

    public void setParameter(String name, String value){ 
     String[] oneParam = {value}; 
     setParameter(name, oneParam); 
    } 

    @SuppressWarnings("unchecked") 
    public void setParameter(String name, String[] values){ 
     parameters.put(name, values); 
    } 
} 

Je suis vraiment avoir du mal à déterminer ce qui pourrait se passer sans regarder la source de mise en œuvre de Tomcat pour le jsp: include et jsp: PARAM actions standard, mais il doit y avoir un conflit. Toute aide serait appréciée.

Répondre

1

Je suppose que le problème est que votre wrapper ne fournit pas l'accès aux nouveaux paramètres, qui ont été ajoutés à la carte de paramètres d'origine après l'avoir copiée.

Probablement, vous devriez faire quelque chose comme ça (et dans les autres méthodes, aussi):

public String[] getParameterValues(String name) { 
    String[] result = null; 
    String[] temp = (String[]) parameters.get(name); 
    if (temp != null){ 
     result = new String[temp.length]; 
     System.arraycopy(temp, 0, result, 0, temp.length); 
    } else { 
     return super.getParameterValues(name); 
    } 
    return result; 
} 
+0

C'était-ce! Merci! –

+0

Ceci est suffisant si le nouveau param ne masque pas un ancien paramètre du même nom. Si c'est le cas, cela ne fonctionnera pas. J'espère que c'est rare. Ce qui pourrait fonctionner est au-dessus, mais même si vous trouvez la correspondance dans votre carte, vous devriez vérifier super.getParameterValues ​​et confirmer que la longueur du tableau de valeur correspond toujours à la vôtre. Sinon, une nouvelle valeur a été ajoutée. – ticktock