Maison >Java >javaDidacticiel >Comment puis-je lire les paramètres de la requête HTTP POST plusieurs fois sans les consommer ?
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!