[17.0.0.2 and later]

Configuration des applications Web Liberty pour relire les données POST

Votre application Web peut relire les données POST de la demande à l'aide du flux d'entrée, d'un lecteur ou de paramètres analysés. Définissez la propriété du conteneur Web pour utiliser ce comportement de relecture.

Avant de commencer

La spécification de servlet Java™ permet à une application Web de lire les données POST d'une demande à l'aide d'un flux d'entrée, à l'aide d'un lecteur ou à l'aide de paramètres analysés. Cependant, l'application Web peut seulement utiliser l'une de ces méthodes pour une demande de lecture des données POST.

Lorsque vous définissez la propriété de conteneur Web, votre application Web peut relire les données POST plusieurs fois. Néanmoins, un lecteur ou un flux d'entrée doit être fermé pour réaliser l'opération de lecture avant qu'une nouvelle opération de lecture puisse être démarrée. Les données n'ont pas besoin d'être entièrement lues avant qu'un lecteur ou un flux d'entrée soit fermé. Une lecture partielle des données peut être effectuée. Pour les paramètres analysés, le conteneur Web lit l'ensemble des données POST puis ferme l'opération de lecture une fois que tous les paramètres sont analysés.

Votre application peut effectuer une relecture non bloquante des données POST. Par exemple, l'application peut effectuer une lecture non bloquante à l'aide de l'écouteur de lecture asynchrone (AsyncReadListener), procéder à une fermeture, puis effectuer une lecture bloquante. L'application peut également, par exemple, effectuer une lecture non bloquante à l'aide de l'écouteur de lecture asynchrone, procéder à une fermeture puis effectuer une seconde lecture non bloquante à l'aide d'un nouvel écouteur de lecture asynchrone.

Lorsque votre application effectue une lecture postérieure des données POST à l'aide d'une lecture non bloquante, le serveur fournit d'abord les données qui ont été lues auparavant. Si la lecture antérieure n'a pas lu toutes les données POST envoyées dans la demande, la nouvelle lecture effectue un blocage lorsque l'application lit les données POST restantes.

Pourquoi et quand exécuter cette tâche

Vous définissez la propriété du conteneur Web sur true. Ensuite, vous exécutez une application Web pouvant relire les données POST. Des exemples sont fournis.

Procédure

  1. Activez la relecture des données POST.

    Lorsque vous définissez la propriété personnalisée enablemultireadofpostdata sur true dans le fichier server.xml, la propriété personnalisée est définie au niveau du serveur. Le comportement de relecture s'applique à toutes les applications Web présentes sur le serveur. Si vous souhaitez que le comportement de relecture s'applique à une application Web spécifique, définissez le paramètre de contexte com.ibm.ws.webcontainer.SET_MULTI_READ_WEBAPP sur true dans le fichier web.xml. Pour une application Web particulière, la définition de paramètre au niveau de l'application Web redéfinit la définition de paramètre au niveau du serveur.

    La valeur par défaut de la propriété personnalisée enablemultireadofpostdata et du paramètre de contexte com.ibm.ws.webcontainer.SET_MULTI_READ_WEBAPP est false.

    Pour activer ce comportement au niveau du serveur, ajoutez l'instruction suivante au fichier server.xml :
    <webContainer enablemultireadofpostdata="true" />
    Pour activer ce comportement au niveau de l'application Web, ajoutez l'instruction context-param suivante au fichier web.xml :
                    
    <context-param>                 
        <param-name>com.ibm.ws.webcontainer.SET_MULTI_READ_WEBAPP</param-name>                    
        <param-value>true</param-value>                
    </context-param>
  2. Exécutez une application Web pouvant relire les données POST.

Exemples

Exemple de lecture bloquante

Les étapes et les fragments de code suivants montrent comment une application peut relire les données POST à l'aide de la méthode getInputStream (), de la méthode getParameter () et de la méthode getReader (). Cependant, vous pouvez utiliser les méthodes avec n'importe quelle combinaison dans votre application.
  1. Obtenez le flux d'entrée à l'aide de la méthode getInputStream ().
  2. Lisez les données.
  3. Fermez le flux d'entrée.
  4. Obtenez le nouveau flux d'entrée à l'aide de la méthode getInputStream ().
  5. Lisez les données.
  6. Fermez le flux d'entrée.
  7. Obtenez un paramètre à l'aide de la méthode getParameter ().
  8. Obtenez le lecteur à l'aide de la méthode getReader ().
  9. Lisez les données.
  10. Fermez le lecteur.
  11. Obtenez à nouveau le paramètre à l'aide de la méthode getParameter ().
          java.io.InputStream in = request.getInputStream();
          byte[] inBytes = new byte[5];

          int readLen = in.read(inBytes);
          if (readLen > 0){
		
	     }              
          if (close)
                in.close();
	
	  java.io.InputStream in2 = request.getInputStream();
          byte[] inBytes = new byte[2048];

          for (int n; (n = in2.read(inBytes, 0, 2048)) != -1;) {
                readLen += n;
          }
          if (close)
                in2.close();

	  String param = request.getParameter("Test");
		
	  java.io.BufferedReader rdr = request.getReader();         
          StringBuffer inBuffer = new StringBuffer();
          char[] inChars = new char[1024];
          for (int n; (n = rdr.read(inChars,0,1024)) != -1;) {
             inBuffer.append(new String(inChars, 0, n));
          }
          rdr.close();

	  String param2 = request.getParameter("Test");

Exemple de lecture non bloquante

Les étapes et les fragments de code suivants montrent comment une application peut relire les données POST à l'aide de la méthode getInputStream () et de la méthode getParameter (). Cependant, vous pouvez utiliser les méthodes avec n'importe quelle combinaison dans votre application.
  1. Obtenez le flux d'entrée à l'aide de la méthode getInputStream ().
  2. Obtenez l'écouteur du flux d'entrée du servlet à l'aide de la méthode setReadListener ().
  3. Lisez les données dans la méthode onDataAvailable ().
  4. Fermez le flux d'entrée.

    Une fois que le flux d'entrée est fermé, la méthode onAllDataRead () et la méthode onError () ne sont pas appelées pour cet écouteur.

  5. Obtenez un paramètre à l'aide de la méthode getParameter ().
  6. Obtenez le nouveau flux d'entrée à l'aide de la méthode getInputStream ().
  7. Obtenez un nouvel écouteur du flux d'entrée de servlet à l'aide de la méthode setReadListener ().
  8. Lisez les données dans la méthode onDataAvailable ().
  9. Si toutes les données sont lues, la méthode onAllDataRead () est appelée pour cet écouteur.
        java.io.InputStream input = request.getInputStream();
	RL1 = ((ServletInputStream) input).setReadListener(readListener);
	
	RL1
	onDataAvailable(){

		if (input.isReady()) {
                         Len = input.read(inBytes);                 
                }
		input.close();

	        String param = request.getParameter("Test");

       	        java.io.InputStream input = request.getInputStream();
		RL2 = ((ServletInputStream) input).setReadListener(readListener);
	}

        RL1 // onAllDataRead() or onError() will not be called for RL1, as the stream has been closed for RL1
     
        RL2
        onDataAvailable(){

		if (input.isReady()) {
                        Len = input.read(inBytes);                 
               }

	 }
	
	 RL2 // If all data read
	 onAllDataRead(){
	 	 AsncContext.complete();
	 }

Icône indiquant le type de rubrique Rubrique Tâche

Nom du fichier : twlp_reread_post.html