Maison >Java >javaDidacticiel >Comment puis-je lire les paramètres de la requête HTTP POST plusieurs fois sans les consommer ?

Comment puis-je lire les paramètres de la requête HTTP POST plusieurs fois sans les consommer ?

DDD
DDDoriginal
2024-12-07 06:18:11207parcourir

How Can I Read HTTP POST Request Parameters Multiple Times Without Consuming Them?

Les paramètres de requête de servlet HTTP disparaissent dans le corps du message

Problème :

Dans un filtre de servlet Java, tentative d'accès à plusieurs Les paramètres de requête HTTP récupérés à partir d'un corps de requête POST entraînent l'indisponibilité du deuxième paramètre. Cela se produit car la consommation des paramètres les consomme pour l'intégralité de la requête.

Question :

Existe-t-il un moyen de lire les paramètres de la requête sans les consommer ?

Réponse :

Alternative Solution :

L'utilisation d'aspects pour créer un composant d'intercepteur personnalisé peut être une solution alternative, permettant des lectures multiples sans impliquer la chaîne de filtrage et offrant une efficacité améliorée.

Solution HttpServletRequestWrapper étendue :

Pour conserver les paramètres du corps de la requête pour plusieurs lectures dans une chaîne de filtres, étendez la HttpServletRequestWrapper et utilisez un cache de flux d'entrée :

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());
  }

  @Override
  public BufferedReader getReader() throws IOException {
    return new BufferedReader(new InputStreamReader(getInputStream()));
  }

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

  // CachedServletInputStream implementation omitted for brevity
}

Utilisation du filtre :

Enveloppez la requête d'origine dans la classe étendue avant de la transmettre à travers la chaîne de filtres :

public class MyFilter implements Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request);

    // Perform multiple reads here

    chain.doFilter(multiReadRequest, response);
  }
}

Cette approche permet des lectures multiples via getInputStream(), getReader() et la récupération des paramètres méthodes.

Mise à jour pour un ServletInputStream plus récent :

Implémentez les méthodes supplémentaires isReady(), setReadListener() et isFinished() dans l'implémentation du flux mis en cache pour adhérer à la mise à jour Interface ServletInputStream.

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!

Déclaration:
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