web-dev-qa-db-fra.com

Comment définir un paramètre dans un HttpServletRequest?

J'utilise un javax.servlet.http.HttpServletRequest pour implémenter une application Web.

Je n'ai aucun problème pour obtenir le paramètre d'une demande en utilisant la méthode getParameter. Cependant, je ne sais pas comment définir un paramètre dans ma demande.

26
Alceu Costa

Vous ne pouvez pas, sans utiliser l'API standard. HttpServletRequest représente une requête reçue par le serveur, et donc l'ajout de nouveaux paramètres n'est pas une option valide (en ce qui concerne l'API).

Vous pouvez en principe implémenter une sous-classe de HttpServletRequestWrapper qui encapsule la requête d'origine, et intercepte les méthodes getParameter(), et transmettre la requête encapsulée lorsque vous transférez.

Si vous suivez cette voie, vous devez utiliser un Filter pour remplacer votre HttpServletRequest par un HttpServletRequestWrapper:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    if (servletRequest instanceof HttpServletRequest) {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        // Check wether the current request needs to be able to support the body to be read multiple times
        if (MULTI_READ_HTTP_METHODS.contains(request.getMethod())) {
            // Override current HttpServletRequest with custom implementation
            filterChain.doFilter(new HttpServletRequestWrapper(request), servletResponse);
            return;
        }
    }
    filterChain.doFilter(servletRequest, servletResponse);
}
29
skaffman

Si vous voulez vraiment le faire, créez un HttpServletRequestWrapper.

public class AddableHttpRequest extends HttpServletRequestWrapper {

   private HashMap params = new HashMap();

   public AddableingHttpRequest(HttpServletRequest request) {
           super(request);
   }

   public String getParameter(String name) {
           // if we added one, return that one
           if ( params.get( name ) != null ) {
                 return params.get( name );
           }
           // otherwise return what's in the original request
           HttpServletRequest req = (HttpServletRequest) super.getRequest();
           return validate( name, req.getParameter( name ) );
   }

   public void addParameter( String name, String value ) {
           params.put( name, value );
   }

}
20
Jeff Williams

D'après votre question, je pense que ce que vous essayez de faire est de stocker quelque chose (un objet, une chaîne ...) pour le transmettre ensuite à un autre servlet, en utilisant RequestDispatcher (). Pour ce faire, vous n'avez pas besoin de définir un paramètre mais un attribut à l'aide

void setAttribute(String name, Object o);

puis

Object getAttribute(String name);
15

Comme mentionné dans les articles précédents, l'utilisation d'un HttpServletReqiestWrapper est la voie à suivre, mais la partie manquante dans ces articles était que, outre la substitution de la méthode getParameter (), vous devez également remplacer d'autres méthodes liées aux paramètres pour produire une réponse cohérente. par exemple. la valeur d'un paramètre ajouté par l'encapsuleur de demande personnalisé doit également être incluse dans la carte de paramètres renvoyée par la méthode getParameterMap (). Voici un exemple:

   public class AddableHttpRequest extends HttpServletRequestWrapper {

    /** A map containing additional request params this wrapper adds to the wrapped request */
    private final Map<String, String> params = new HashMap<>();

    /**
     * Constructs a request object wrapping the given request.
     * @throws Java.lang.IllegalArgumentException if the request is null
     */
    AddableHttpRequest(final HttpServletRequest request) {
        super(request)
    }

    @Override
    public String getParameter(final String name) {
        // if we added one with the given name, return that one
        if ( params.get( name ) != null ) {
            return params.get( name );
        } else {
            // otherwise return what's in the original request
            return super.getParameter(name);
        }
    }


    /**
     * *** OVERRIDE THE METHODS BELOW TO REFLECT PARAMETERS ADDED BY THIS WRAPPER ****
     */

    @Override
    public Map<String, String> getParameterMap() {
        // defaulf impl, should be overridden for an approprivate map of request params
        return super.getParameterMap();
    }

    @Override
    public Enumeration<String> getParameterNames() {
        // defaulf impl, should be overridden for an approprivate map of request params names
        return super.getParameterNames();
    }

    @Override
    public String[] getParameterValues(final String name) {
        // defaulf impl, should be overridden for an approprivate map of request params values
        return super.getParameterValues(name);
    }
}
1
Ashish Marwal

Le remplacement de getParameterMap manquant a fini par être un vrai problème pour moi. Voilà donc ce que je me suis retrouvé avec:

import Java.util.HashMap;
import Java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/***
 * Request wrapper enabling the update of a request-parameter.
 * 
 * @author E.K. de Lang
 *
 */
final class HttpServletRequestReplaceParameterWrapper
    extends HttpServletRequestWrapper
{

    private final Map<String, String[]> keyValues;

    @SuppressWarnings("unchecked")
    HttpServletRequestReplaceParameterWrapper(HttpServletRequest request, String key, String value)
    {
        super(request);

        keyValues = new HashMap<String, String[]>();
        keyValues.putAll(request.getParameterMap());
        // Can override the values in the request
        keyValues.put(key, new String[] { value });

    }

    @SuppressWarnings("unchecked")
    HttpServletRequestReplaceParameterWrapper(HttpServletRequest request, Map<String, String> additionalRequestParameters)
    {
        super(request);
        keyValues = new HashMap<String, String[]>();
        keyValues.putAll(request.getParameterMap());
        for (Map.Entry<String, String> entry : additionalRequestParameters.entrySet()) {
            keyValues.put(entry.getKey(), new String[] { entry.getValue() });
        }

    }

    @Override
    public String getParameter(String name)
    {
        if (keyValues.containsKey(name)) {
            String[] strings = keyValues.get(name);
            if (strings == null || strings.length == 0) {
                return null;
            }
            else {
                return strings[0];
            }
        }
        else {
            // Just in case the request has some tricks of it's own.
            return super.getParameter(name);
        }
    }

    @Override
    public String[] getParameterValues(String name)
    {
        String[] value = this.keyValues.get(name);
        if (value == null) {
            // Just in case the request has some tricks of it's own.
            return super.getParameterValues(name);
        }
        else {
            return value;
        }
    }

    @Override
    public Map<String, String[]> getParameterMap()
    {
        return this.keyValues;
    }

}
0
Eelco