[17.0.0.2 und höher]

Liberty-Webanwendungen für das erneute Lesen von POST-Daten konfigurieren

Ihre Webanwendung kann die POST-Daten der Anforderung im Geltungsbereich mit dem Eingabedatenstrom, mit einem Eingabeprogramm oder mit geparsten Parametern erneut lesen. Definieren Sie die Web-Container-Eigenschaft so, dass dieses Verhalten zum erneuten Lesen von Daten verwendet wird.

Vorbereitende Schritte

Die Java™-Servlet-Spezifikation ermöglicht einer Webanwendung, POST-Daten einer Anforderung mithilfe eines Eingabedatenstroms, mithilfe eines Eingabeprogramms oder mithilfe geparster Parameter erneut zu lesen. Die Webanwendung kann jedoch nur eine dieser Methoden im Geltungsbereich einer Anwendung verwenden, um die POST-Daten zu lesen.

Wenn Sie die Web-Container-Eigenschaft definieren, kann Ihre Webanwendung die POST-Daten mehrfach lesen. Ein Eingabeprogramm oder Eingabedatenstrom muss jeoch geschlossen werden, um die Leseoperation zu schließen, bevor eine neue Leseoperation gestartet werden kann. Die Daten müssen nicht vollständig gelesen werden, bevor ein Eingabeprogramm oder Eingabedatenstrom geschlossen wird. Ein partielles Lesen der Daten kann vorgenommen werden. Bei geparsten Parametern liest der Web-Container die vollständigen POST-Daten und schließt dann die Leseoperation, nachdem alle Parameter geparst wurden.

Ihre Anwendung kann POST-Daten nicht blockierend erneut lesen. Die Anwendung kann eine nicht blockierende Leseoperation beispielsweise ausführen, indem sie den Listener für asynchrones Lesen (AsyncReadListener) verwendet, eine Schließoperation ausführt und dann eine nicht blockierende Leseoperation ausführt. Die Anwendung kann beispielsweise auch eine nicht blockierende Leseoperation ausführen, indem Sie den Listener für asynchrones Lesen verwendet, eine Schließoperation ausführt und dann eine zweite nicht blockierende Leseoperation mit einem neuen Listener für asynchrones Lesen ausführt.

Wenn Ihre Anwendung die POST-Daten nachfolgend mit einer nicht blockierneden Leseoperation liest, stellt der Server zuerst die zuvor gelesenen Daten bereit. Falls bei der zuvor ausgeführten Leseoperation nicht alle in der Anforderung gesendeten POST-Daten gelesen wurden, nimmt die neue Leseoperation eine Blockierung vor, wenn die Anwendung die verbleibenden POST-Daten liest.

Informationen zu diesem Vorgang

Sie setzen die Web-Container-Eigenschaft auf true. Anschließend führen Sie eine Webanwendung aus, die POST-Daten erneut lesen kann. Es werden Beispiele bereitgestellt.

Vorgehensweise

  1. Aktivieren Sie das erneute Lesen von POST-Daten.

    Wenn Sie die angepasste Eigenschaft "enablemultireadofpostdata" in der Datei server.xml auf true setzen, wird die angepasste Eigenschaft auf Serverebene definiert. Das Verhalten für das erneute Lesen der POST-Daten gilt damit für alle Webanwendungen auf dem Server. Wenn Sie möchten, dass das Verhalten für das erneute Lesen der POST-Daten nur für eine bestimmte Webanwendung zur Anwendung kommt, setzen Sie den Kontextparameter "com.ibm.ws.webcontainer.SET_MULTI_READ_WEBAPP" in der Datei web.xml auf true. Die Einstellung auf Webanwendungsebene überschreibt die Einstellung auf Serverebene für eine bestimmte Webanwendung.

    Der Standardwert für die angepasste Eigenschaft "enablemultireadofpostdata" und den Kontextparameter "com.ibm.ws.webcontainer.SET_MULTI_READ_WEBAPP" ist false.

    Zum Aktivieren dieses Verhaltens auf Serverebene fügen Sie der Datei server.xml die folgende Anweisung hinzu:
    <webContainer enablemultireadofpostdata="true" />
    Zum Aktivieren dieses Verhaltens auf Webanwendungsebene fügen Sie der Datei web.xml die folgende Anweisung "context-param" hinzu:
                    
    <context-param>                 
        <param-name>com.ibm.ws.webcontainer.SET_MULTI_READ_WEBAPP</param-name>                    
        <param-value>true</param-value>                
    </context-param>
  2. Führen Sie eine Webanwendung aus, die POST-Daten erneut lesen kann.

Beispiele

Beispiel für blockierendes Lesen

Die folgenden Schritte und Codesnippets veranschaulichen, wie eine Anwendung POST-Daten mit der Methode "getInputStream ()", der Methode "getParameter ()" und der Methode "getReader ()" erneut lesen kann. Sie können die Methoden in Ihrer Anwendung jedoch in beliebiger Kombination verwenden.
  1. Rufen Sie den Eingabedatenstrom mit der Methode "getInputStream ()" ab.
  2. Lesen Sie die Daten.
  3. Schließen Sie den Eingabedatenstrom.
  4. Rufen Sie den neuen Eingabedatenstrom mit der Methode "getInputStream ()" ab.
  5. Lesen Sie die Daten.
  6. Schließen Sie den Eingabedatenstrom.
  7. Rufen Sie einen Parameter mit der Methode "getParameter ()" ab.
  8. Rufen Sie das Eingabeprogramm mit der Methode "getReader ()" ab.
  9. Lesen Sie die Daten.
  10. Schließen Sie das Eingabeprogramm.
  11. Rufen Sie den Parameter mit der Methode "getParameter ()" erneut ab.
          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");

Beispiel für nicht blockierendes Lesen

Die folgenden Schritte und Codesnippets veranschaulichen, wie eine Anwendung POST-Daten mit der Methode "getInputStream ()" und der Methode "getParameter ()" erneut lesen kann. Sie können die Methoden in Ihrer Anwendung jedoch in beliebiger Kombination verwenden.
  1. Rufen Sie den Eingabedatenstrom mit der Methode "getInputStream ()" ab.
  2. Rufen Sie den Listener aus dem Eingabedatenstrom des Servlets mit der Methode "setReadListener ()" ab.
  3. Lesen Sie die Daten in der Methode "onDataAvailable ()".
  4. Schließen Sie den Eingabedatenstrom.

    Nach dem Schließen des Eingabedatenstroms werden die Methoden "onAllDataRead ()" und "onError ()" für diesen Listener nicht mehr aufgerufen.

  5. Rufen Sie einen Parameter mit der Methode "getParameter ()" ab.
  6. Rufen Sie den neuen Eingabedatenstrom mit der Methode "getInputStream ()" ab.
  7. Rufen Sie einen neuen Listener aus dem Eingabedatenstrom des Servlets mit der Methode "setReadListener ()" ab.
  8. Lesen Sie die Daten in der Methode "onDataAvailable ()".
  9. Nachdem alle Daten gelesen wurden, wird die Methode "onAllDataRead ()" für diesen Listener aufgerufen.
        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() oder onError() wird für RL1 nicht aufgerufen, weil der Datenstrom für RL1 geschlossen wurde
     
        RL2
        onDataAvailable(){

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

	 }
	
	 RL2 // Nach dem Lesen aller Daten
	 onAllDataRead(){
	 	 AsncContext.complete();
	 }

Symbol das den Typ des Artikels anzeigt. Taskartikel

Dateiname: twlp_reread_post.html