3 votes

La modification des paramètres HttpServletRequest avec un filtre de servlet ne semble pas fonctionner

J'ai besoin de supprimer/modifier certaines HttpServletRequest paramètres. J'essaie d'y parvenir en utilisant un fichier Filter sur la base de la question J'ai posté il y a quelques jours.

En el Filter J'essaie d'envelopper le HttpServletRequest en héritant de la HttpServletRequestWrapper comme suit.

private final static class FilteredRequest extends HttpServletRequestWrapper {

    public FilteredRequest(ServletRequest request) {
        super((HttpServletRequest) request);
    }

    @Override
    public String getParameter(String paramName) {
        return super.getParameter(paramName);
    }

    @Override
    public String[] getParameterValues(String paramName) {
        return super.getParameterValues(paramName);
    }

    @Override
    public Map getParameterMap() {
        Map<Object, Object> parameterMap = new HashMap<Object, Object>();
        Map originalParameterMap = super.getParameterMap();

        for (Object o : originalParameterMap.entrySet()) {
            Map.Entry<Object, Object> pairs = (Entry<Object, Object>) o;
            parameterMap.put(pairs.getKey(), pairs.getValue());
        }
        return parameterMap;  //Returning a modifiable ParameterMap.
    }
}

Il s'agit d'une classe interne au sein de la Filter la classe. Dans le doFilter() méthode,

chain.doFilter(new FilteredRequest(request), (HttpServletResponse)response);

le constructeur de la classe ci-dessus est invoqué (qui englobe la requête).


Maintenant, je m'attends à ce que n'importe lequel des paramètres de la requête soit modifié/annulé dans ma classe de contrôleur Spring MVC . J'essaie de supprimer le paramètre dans la classe du contrôleur comme suit.

Map requestMap=request.getParameterMap();
requestMap.remove("txt_country_name");

Alternativement,

requestMap.put("txt_country_name", null);

En conséquence, le paramètre de demande txt_country_name doit être supprimé de la HttpServletRequest mais il n'est pas supprimé (il ne lève pas d'exception comme " Aucune modification n'est autorisée sur une carte de paramètres verrouillée. "). Qu'est-ce qui m'échappe ici ? Est-ce que je suis un mauvais chemin ?

Au fait, Créer/utiliser un attribut de requête tout le temps dans l'ensemble de l'application ne semble pas être la meilleure solution. .

[Je dois supprimer/modifier le paramètre de la demande. dans la classe du contrôleur Spring MVC et non au sein de la Filter lui-même]

4voto

JB Nizet Points 250258

Votre méthode remove modifie la carte mutable retournée par getParameterMap() . Mais le prochain appel à getParameterMap() reconstruit une nouvelle carte mutable contenant tous les paramètres de la requête enveloppée.

La carte mutable doit être construite lorsque le FilteredRequest est construit, et il doit être stocké dans un champ d'instance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X