Servlet 3.1 기능
Servlet 3.1 기능은 Servlet 3.1 스펙에 대한 전체 지원을 제공합니다.
새 Servlet 3.1 기능에 대한 설명은 Servlet 3.1 스펙에서 제공되며 여기서는 제공되지 않습니다. 하지만 Servlet 3.1 기능에 대한 추가적인 고려사항은 다음과 같습니다.
비동기 I/O
Servlet 3.1 기능의 새 기능은 비차단 읽기가 시작될 때 나머지 요청 수명 동안의 자원은 API를 호출할 수 없도록 지정하여 차단 읽기를 유발할 수 있습니다. 예를 들어, 자원에 의해 읽기 리스너가 설정된 후 POST 요청의 경우 getParameter() 및 getPart() API에 대한 후속 호출에서 IllegalStateException이 발생합니다.
비동기 서블릿에 대해 작업할 때는 AsyncContext.setTimeout API를 사용하여 제한시간을 설정하는 것을 고려해야 합니다. 그렇지 않으면 컨테이너 기본값(예: 30초)이 사용됩니다. ServletRequest를 사용하여 비동기로 시작될 때마다 제한시간이 재설정됩니다. StartAsync API가 호출되고 마지막으로 비동기로 시작된 이후의 제한시간 기간 내에 AsyncContext.complete API가 호출되지 않으면 만료됩니다. Servlet-3.1 기능에서 제공하는 비동기 I/O 지원을 사용하는 경우 AsyncContext.setTimeout API를 사용하여 제한시간 값을 설정하여 비동기 I/O도 완료될 수 있게 하십시오. 환경 또는 네트워크 속도 등의 기타 외부 요인에 따라 완료 여부가 결정됩니다.
처리 업그레이드
<webContainer upgradeReadTimeout="5000" />
<webContainer upgradeWriteTimeout="5000" />
요청이 비동기 서블릿에 의해 처리 중인 경우에는 Servlet 3.1에 대한 업그레이드 기능을 사용하여 요청을 업그레이드해서는 안 됩니다.
업그레이드를 위해 Servlet 3.1 기능을 지원하는 애플리케이션을 사용하려면 업그레이드된 요청에 대한 연결이 업그레이드를 호스팅하는 애플리케이션과 클라이언트 사이에서 열려 있어야 합니다. ReadListener 또는 WriteListener 등의 기타 자원이나 핸들러에서 업그레이드 처리가 완료되었을 때 해당 애플리케이션이 WebConnection close()를 시작하지 않으면 서버가 재순환될 때까지 TCP 연결은 열린 상태를 유지합니다.
Servlet 3.1 기능에서 UpgradeHandler 및 ReadListener를 사용하는 경우에는 업그레이드된 애플리케이션을 호스팅하는 서버에 대한 연결을 클라이언트가 닫을 때만 ReadListener.onAllDataRead 메소드가 호출됩니다. onReadListener.onAllDataRead에 대한 Javadoc에는 "현재 요청에 대한 모든 데이터를 읽을 때 호출됨"이라고 표시됩니다. 업그레이드의 경우 업그레이드된 데이터는 HTTP 요청 본문 데이터가 구분되는 방식으로 구분되지 않으므로 서버가 데이터의 끝을 모릅니다. 클라이언트 연결이 닫히는 시기를 제외하고 데이터의 끝에 대한 결정은 없습니다.
양식 기반 인증
성공적으로 인증되고 나면 클라이언트는 원래 요청의 자원으로 경로 재지정됩니다. Servlet 3.1 스펙에서는 다음과 같이 지정합니다. "경로 재지정된 요청의 HTTP 메소드의 예측 가능성을 향상시키려면 303(SC_SEE_OTHER) 상태 코드를 사용하여 컨테이너를 경로 재지정해야 합니다(302 상태 코드를 사용해야 하는 HTTP 1.0 사용자 에이전트와의 상호 운용성이 필요한 경우는 제외)." Servlet-3.1 기능은 HTTP 1.0 사용자 에이전트와의 상호 운용성을 유지하며 항상 302 상태 코드를 사용합니다. 보안을 위한 Servlet 3.1 구성에 대한 자세한 정보는 Servlet 3.1에 대한 Liberty 프로파일 구성 주제를 읽으십시오.
큰 게시 데이터
ServletRequest.getContentLengthLong() API를 추가하려면 길이가 Integer.MAX_VALUE보다 길어서 1바이트 배열 또는 문자열에 완전히 수용될 수 없는 게시 데이터를 수신하기 위한 지원이 필요합니다.
String getParamter(String name)
String[] getParameterValues()
Map<String,String> getParameterMap()
결합되면 Integer.MAX_VALUE보다 길이가 긴 여러 매개변수가 포함된 게시 데이터를 전송할 수 있습니다. 하지만 각각의 개별 매개변수 이름 및 매개변수 값의 길이는 Integer.MAX_VALUE보다 짧아야 합니다.
- Integer.MAX-VALUE보다 짧은 길이로 게시 데이터를 전송해야 합니다.
- 웹 컨테이너(예: 매개변수 또는 파트)에 의해 처리되는 게시 데이터는 처리를 시작하기 전에 완전히 읽어야 합니다. 게시 데이터는 웹 컨테이너 처리를 성공하기 위해 게시 데이터 크기의 두 배만큼의 메모리를 요구하므로 게시 데이터는 큰 게시 데이터에 대해 상당한 메모리를 요구합니다.