Maison > Java > javaDidacticiel > Comment conserver les paramètres du corps POST dans les servlets Java pour plusieurs lectures ?

Comment conserver les paramètres du corps POST dans les servlets Java pour plusieurs lectures ?

Mary-Kate Olsen
Libérer: 2024-11-30 22:42:11
original
899 Les gens l'ont consulté

How to Preserve POST Body Parameters in Java Servlets for Multiple Reads?

Comment conserver les paramètres de corps POST dans une requête de servlet HTTP

Lorsque vous travaillez avec des requêtes HTTP dans des servlets Java, il est essentiel de prendre en compte l'impact de accéder aux paramètres de requête lors d'un traitement ultérieur dans la chaîne de filtrage. Par défaut, la lecture des paramètres du corps de la requête POST les consomme, les rendant indisponibles pour les filtres ou gestionnaires suivants.

Le problème : consommer les paramètres du corps POST

Dans les servlets Java , les paramètres du corps de la requête sont accessibles via request.getParameter(). Cependant, cette méthode consomme le inputStream et par conséquent les tentatives ultérieures de récupération des paramètres échoueront. Ce comportement est particulièrement problématique pour les filtres qui doivent accéder aux paramètres avant qu'ils ne soient consommés par les gestionnaires en aval.

Solution : extension de HttpServletRequestWrapper

Pour résoudre ce problème, nous pouvons étendez HttpServletRequestWrapper pour créer une implémentation de requête personnalisée qui met en cache le corps de la requête. Cela nous permet de lire le corps plusieurs fois sans le consommer.

Voici un exemple d'implémentation :

public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {

    private ByteArrayOutputStream cachedBytes;

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

    @Override
    public ServletInputStream getInputStream() throws IOException {
        if (cachedBytes == null) {
            cacheInputStream();
        }

        return new CachedServletInputStream(cachedBytes.toByteArray());
    }

    private void cacheInputStream() throws IOException {
        cachedBytes = new ByteArrayOutputStream();
        IOUtils.copy(super.getInputStream(), cachedBytes);
    }

    private static class CachedServletInputStream extends ServletInputStream {

        private final ByteArrayInputStream buffer;

        public CachedServletInputStream(byte[] contents) {
            this.buffer = new ByteArrayInputStream(contents);
        }

        @Override
        public int read() {
            return buffer.read();
        }

        // Implement other methods required by ServletInputStream interface, such as isFinished, isReady, setReadListener, etc.

    }
}
Copier après la connexion

Utilisation :

Pour préserver le POST paramètres body, nous pouvons envelopper la requête originale dans notre MultiReadHttpServletRequest avant de la passer à travers le filtre chain :

public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        // Wrap the request to enable multiple reads of the request body
        MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request);

        // Read the request body for our own processing
        doMyThing(multiReadRequest.getInputStream());

        // Continue the filter chain with the wrapped request, allowing subsequent handlers to access the cached request body
        chain.doFilter(multiReadRequest, response);
    }
}
Copier après la connexion

En utilisant cette approche, nous pouvons accéder plusieurs fois aux paramètres corporels POST sans avoir à craindre de les consommer prématurément.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal