저는 Jetty 9를 사용하고 있으며 모든 바디가 서버에 도착하기 전에 PUT 요청의 헤더를 처리하려고합니다. 여기에 내가 무슨 짓을했는지의 :Jetty Embedded - PUT Verb - 바디가 도착하기 전에 프로세스 헤더가 도착합니다.
public class SimplestServer
{
public static void main(String[] args) throws Exception
{
Server server = new Server(9080);
ServletHandler handler = new ServletHandler();
server.setHandler(handler);
handler.addServletWithMapping(HelloServlet.class, "/*");
handler.addFilterWithMapping(HelloPrintingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
server.start();
server.dumpStdErr();
server.join();
}
public static class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(System.currentTimeMillis() + ": Hello from HelloServlet GET");
}
@Override
protected void doPut(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(System.currentTimeMillis() + ": Hello from HelloServlet PUT");
}
}
public static class HelloPrintingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println(System.currentTimeMillis() + ": Hello from filter");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println(System.currentTimeMillis() + ": Init from filter");
}
@Override
public void destroy() {
System.out.println(System.currentTimeMillis() + ": Destroy from filter");
}
}
}
Client.java 간단히 말해서
public class SimplestClient
{
public static void main(String[] args) throws Exception
{
URL url = new URL("http://localhost:9080/resource");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setDoOutput(true);
httpCon.setRequestMethod("PUT");
OutputStream out = httpCon.getOutputStream();
byte[] b = new byte[65536];
Random r = new Random();
r.nextBytes(b);
for (int i = 0; i < 1024; i++) {
out.write(b);
}
System.out.println(System.currentTimeMillis() + ": Data sent. Waiting 5 seconds...");
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
out.close();
System.out.println(System.currentTimeMillis() + ": Done!");
httpCon.getInputStream();
}
}
, 서버 프로그램이 요청이 도착 포트 9080
에 연결을 수신 : Server.java는
HelloPrintingFilter
이 실행되면 요청은
HelloServlet
에 의해 처리됩니다. 대신 클라이언트는 서버에 연결하여 많은 데이터를 전송 한 다음 5 초 동안 대기하고 마지막으로 서버와의 연결을 닫습니다.
두 프로그램의 실행은 다음과 같은 결과가 산출 : 난 단지 내 필터 코드는 결국 실행 얻을 수있는 타임 스탬프를 보면
1469613527373: Hello from filter
1469613527373: Hello from HelloServlet PUT
:
클라이언트 :
1469613522350: Data sent. Waiting 5 seconds...
1469613527351: Done!
서버 시체가 도착했습니다. 아무도 나에게 그걸하는 법을 설명 할 수 있을까? 일반적인 사용 사례는 다음과 같습니다. 클라이언트가 5GB 파일을 업로드하려고합니다. 헤더가 도착하자마자 Content-MD5 헤더 또는 확인해야하는 맞춤 헤더가 있는지 확인하여 확인 여부를 확인하고 싶습니다. 요청이 OK이면 본문 처리를 시작합니다. 요청이 OK가 아니면 연결을 닫으십시오.
감사합니다.
잘못된 가정. [청크 분할 전송 인코딩] (https://en.wikipedia.org/wiki/Chunked_transfer_encoding)이라고하는 'Content-Length' 헤더없이 요청 및/또는 응답 본문 내용을 전송하는 것은 완전히 유효합니다. Jetty는 클라이언트 및/또는 서버로 구입 즉시 사용할 수 있습니다. –