[17.0.0.2 and later]

POST 데이터를 다시 읽도록 Liberty 웹 애플리케이션 구성

입력 스트림, 리더 또는 구문 분석된 매개변수를 사용하여 웹 애플리케이션에서 범위 내에 있는 요청의 POST 데이터를 다시 읽을 수 있습니다. 이 다시 읽기 동작을 사용하려면 웹 컨테이너 특성을 설정하십시오.

시작하기 전에

Java™ 서블릿 스펙을 사용하는 경우 웹 애플리케이션에서 입력 스트림, 리더 또는 구문 분석된 매개변수를 사용하여 요청의 POST 데이터를 읽어들일 수 있습니다. 하지만 웹 애플리케이션은 POST 데이터를 읽어들일 요청의 범위 내에서만 이러한 메소드 중 하나를 사용할 수 있습니다.

웹 컨테이너 특성을 설정하는 경우 웹 애플리케이션에서 POST 데이터를 여러 번 다시 읽어들일 수 있습니다. 하지만 새 읽기 조작을 시작하려면 먼저 리더 또는 입력 스트림을 닫아서 읽기 조작을 완료해야 합니다. 리더 또는 입력 스트림을 닫기 위해 데이터를 완전히 읽어들여야 할 필요는 없습니다. 데이터의 부분 읽기도 완료할 수 있습니다. 구문 분석된 매개변수의 경우 웹 컨테이너에서 전체 POST 데이터를 읽어들인 후 모든 매개변수가 구문 분석되면 읽기 조작을 닫습니다.

애플리케이션에서 POST 데이터에 대한 비블로킹 다시 읽기 작업을 수행할 수 있습니다. 예를 들어 애플리케이션에서 비동기 읽기 리스너(AsyncReadListener)를 사용하고 닫기를 수행한 후 블로킹 읽기를 수행하여 비블로킹 읽기를 수행할 수 있습니다. 또한 애플리케이션에서 예를 들어 비동기 읽기 리스너를 사용하고 닫기를 수행한 후 새 비동기 읽기 리스너를 사용한 두 번째 비블로킹 읽기를 수행하여 비블로킹 읽기를 수행할 수도 있습니다.

애플리케이션에서 비블로킹 읽기를 사용하여 POST 데이터에 대한 후속 읽기를 수행하는 경우 먼저 서버에서 이전에 읽어들인 데이터를 제공합니다. 이전에 완료된 읽기가 요청에서 전송된 모든 POST 데이터를 읽어들이지 않은 경우 애플리케이션에서 나머지 POST 데이터를 읽어들일 때 새 읽기에서 블록을 수행합니다.

이 태스크 정보

웹 컨테이너 특성을 true로 설정하십시오. 그런 다음 POST 데이터를 다시 읽어들일 수 있는 웹 애플리케이션을 실행하십시오. 예제가 제공됩니다.

프로시저

  1. POST 데이터 다시 읽기를 사용으로 설정하십시오.

    server.xml 파일에서 enablemultireadofpostdata 사용자 정의 특성을 true로 설정하는 경우 이 사용자 정의 특성이 서버 레벨로 설정됩니다. 다시 읽기 동작은 서버에 있는 모든 웹 애플리케이션에 적용됩니다. 다시 읽기 동작이 특정 웹 애플리케이션에서 적용되도록 하려면 web.xml 파일에서 com.ibm.ws.webcontainer.SET_MULTI_READ_WEBAPP 컨텍스트 매개변수를 true로 설정하십시오. 특정 웹 애플리케이션의 경우 웹 애플리케이션 레벨의 설정이 서버 레벨의 설정을 대체합니다.

    enablemultireadofpostdata 사용자 정의 특성 및 com.ibm.ws.webcontainer.SET_MULTI_READ_WEBAPP 컨텍스트 매개변수의 기본값은 모두 false입니다.

    서버 레벨에서 이 동작을 사용으로 설정하려면 server.xml 파일에 다음 명령문을 추가하십시오.
    <webContainer enablemultireadofpostdata="true" />
    웹 애플리케이션 레벨에서 이 동작을 사용으로 설정하려면 web.xml 파일에 다음 컨텍스트 매개변수 명령문을 추가하십시오.
                    
    <context-param>
        <param-name>com.ibm.ws.webcontainer.SET_MULTI_READ_WEBAPP</param-name>
        <param-value>true</param-value>
    </context-param>
  2. POST 데이터를 다시 읽어들일 수 있는 웹 애플리케이션을 실행하십시오.

예제

블로킹 읽기 예제

다음 단계 및 코드 스니펫은 애플리케이션에서 getInputStream () 메소드, getParameter () 메소드 및 getReader () 메소드를 사용하여 POST 데이터를 다시 읽어들이는 방법을 보여줍니다. 하지만 애플리케이션에서 임의의 조합으로 해당 메소드를 사용할 수 있습니다.
  1. getInputStream () 메소드를 사용하여 입력 스트림을 가져옵니다.
  2. 데이터를 읽어들입니다.
  3. 입력 스트림을 닫습니다.
  4. getInputStream () 메소드를 사용하여 새 입력 스트림을 가져옵니다.
  5. 데이터를 읽어들입니다.
  6. 입력 스트림을 닫습니다.
  7. getParameter () 메소드를 사용하여 매개변수를 가져옵니다.
  8. getReader () 메소드를 사용하여 리더를 가져옵니다.
  9. 데이터를 읽어들입니다.
  10. 리더를 닫습니다.
  11. 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");

비블로킹 읽기 예제

다음 단계 및 코드 스니펫은 애플리케이션에서 getInputStream () 메소드 및 getParameter () 메소드를 사용하여 POST 데이터를 다시 읽어들이는 방법을 보여줍니다. 하지만 애플리케이션에서 임의의 조합으로 해당 메소드를 사용할 수 있습니다.
  1. getInputStream () 메소드를 사용하여 입력 스트림을 가져옵니다.
  2. setReadListener () 메소드를 사용하여 서블릿 입력 스트림에서 리스너를 가져옵니다.
  3. onDataAvailable () 메소드를 사용하여 데이터를 읽어들입니다.
  4. 입력 스트림을 닫습니다.

    입력 스트림이 닫힌 후에는 이 리스너에 대한 onAllDataRead () 메소드 및 onError () 메소드가 호출되지 않습니다.

  5. getParameter () 메소드를 사용하여 매개변수를 가져옵니다.
  6. getInputStream () 메소드를 사용하여 새 입력 스트림을 가져옵니다.
  7. setReadListener () 메소드를 사용하여 서블릿 입력 스트림에서 새 리스너를 가져옵니다.
  8. onDataAvailable () 메소드를 사용하여 데이터를 읽어들입니다.
  9. 모든 데이터를 읽어들인 경우 이 리스너에 대한 onAllDataRead () 메소드가 호출됩니다.
        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();
	 }

주제의 유형을 표시하는 아이콘 태스크 주제

파일 이름: twlp_reread_post.html