이 기사에서는 양식 데이터 및 요청 페이로드의 AJAX 게시물 요청에서 서블릿을 얻는 방법에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
HTTP 요청에서 GET 요청 인 경우 양식 매개 변수는 이름 = value & name1 = value1의 형식으로 URL에 첨부됩니다. 사후 요청 인 경우 양식 매개 변수는 요청 본문에 있으며 이름 = value & name1 = value1의 형식으로 요청 본문에 있습니다. Chrome Developer 도구를 통해 다음을 볼 수 있습니다 (여기서는 읽을 수있는 양식이 있습니다. 실제 HTTP 요청 프로토콜 요청 형식).
요청 받기 :
requestUrl : http : //127.0.0.1 : 8080/test/test.do? name = mikan & address = streetRequest 메소드 : GetStatus 코드 : 200 OKRequest HeadersAccept : Text/HTML, Application/XHTML+XML, Application/XML; Q = 0.9, 이미지/웹p,*/*; Q = 0.8accept-encoding : gzip, deflate, sdchaccept-language : zh-cn, zh; q = 0.8, en; q = 0.6alexatoolbar-alx_ns_ns_ns_. pH : AlexAtoolbar/alxg-3.2connection : repud-aliveCookie : jssessionID = 74AC93F9F572980B6FC10474CD8EDD8DHOST : 127.0.0.1 : 8080referer : http : //127.0.1 : 8080/test/index.jspuser-agent : (Wind
사후 요청 :
requestUrl : http://127.0.0.1:8080/test/test.dorequest 메소드 : PostStatus 코드 : 200 Okrequest HeadersAccept : Text/Html, Application/XHTML+XML, Application/XML; Q = 0.9, Image/Webp,*/*; Q = 0.8accept-Encoding : Gzip, deflate, s DCHACCEPT-LANGUAGE : ZH-CN, ZH; Q = 0.8, en; q = 0.6alexatoolbar-alx_ns_ph : AlexAtoolbar/alxg-3.2cache-control : max-age = 0connection : Keep-AliveContent-Length : 25Content-Type : application/x-www-form-urlencodedCookie : jsessionID = 74AC93F9F572980B6FC10474CD8 Edd8dhost : 127.0.0.1 : 8080origin : http : //127.0.0.1 : 8080referer : http : //127.0.0.1 : 8080/test/index.jspuser-agent : muszilla/5.0 (Windows NT 6.1) Applewebkit/537.36 (KHTML, Gecko와 같은 KHTML) Chrome/33.0.1750.149 Safari/537.36Form Dataname : MikanAddress : StreetResponse 컨텐츠-2Date : 2Date : Sun, 11:05:33 GMTSERVER : Apache-COYOTE/1.1
여기서 게시물 요청의 내용 유형은 Application/x-Www-Form-urlencoded이고 매개 변수는 요청 본문, 즉 위 요청의 양식 데이터에 있습니다.
서블릿에서 양식 매개 변수는 request.getParameter(name) 에 의해 얻을 수 있습니다.
기본 AJAX Post 요청을 사용하는 경우 :
함수 getxmlhttprequest () {var xhr; if (wind } else if (wind } else {xhr = null; } return xhr;} function save () {var xhr = getxmlhttprequest (); xhr.open ( "post", "http://127.0.0.1:8080/test/test.do"); var data = "name = mikan & address = street ..."; xhr.send (데이터); xhr.onreadystatechange = function () {if (xhr.readystate == 4 && xhr.status == 200) {alert ( "returned :"+ xhr.responsetext); }};}Chrome의 개발자 도구를 통해 다음과 같이 요청 헤더를 참조하십시오.
requestUrl : http://127.0.0.1:8080/test/test.dorequest 메소드 : PostStatus 코드 : 200 Okrequest HeadersAccept :*/*수락-인코딩 : gzip, deflate, sdchaccept-language : zh-cn, zh; q = 0.8, en; q = 0.6alexatoolbar-alx_ns_ph : alxatoolbar/alxg-3.2connection : keep-alivecontent-length : 28content-type : t ext/plain; charset = utf-8cookie : jssessionid = c40c7823648e952e7c6f7d2e687a0a89host : 127.0.0.1 : 8080o 리그 : http : //127.0.0.1 : 8080referer : http : //127.0.0.1 : 8080/test/index.jspuser-agent : Mozilla/5.0 (Windows NT 6.1) Applewebkit/537.36 (Gecko Like Gecko) Chrome/33.0.1750.149 Safari/537.36request payloadname = mikan & address = streetresponse headerscontent-length : 2date : 2 월 11 일 11:49:23 Gmtserver : Apache-coyote/1.
요청 된 컨텐츠 유형은 text/plain;charset=UTF-8 이며 요청 양식 매개 변수는 requestPayLoad에 있습니다.
서블릿의 request.getParameter(name) 가 비어 있습니다. 왜? 그러한 매개 변수는 어떻게 얻어야합니까?
이 문제를 이해하기 위해 요청 매개 변수 처리에서 Tomcat7.0.53의 소스 코드를 읽고 마침내 무슨 일이 일어나고 있는지 알아 냈습니다.
HTTP 포스트 양식 요청을 제출할 때 사용 된 컨텐츠 유형은 application/x-www-form-urlencoded 이며 요청 헤더 요청 헤드러가 지정되지 않은 경우 기본적으로 사용되는 컨텐츠 유형은 text/plain;charset=UTF-8 .
Tomcat은 컨텐츠 유형 멀티 파트/양식 데이터 (파일 업로드) 및 응용 프로그램/x-www- 형식 방환 (Post Request)에 대해 "특수 처리"를 수행하기 때문입니다. 아래의 관련 처리 코드를 살펴 보겠습니다.
Tomcat의 httpservletrequest 클래스의 구현 클래스는 org.apache.catalina.connector.request (실제로 org.apache.coyote.request)이며 요청 매개 변수를 처리하는 방법은 protected void parseParameters() . 이 메소드에서 컨텐츠 유형 멀티 파트/양식-데이터 (파일 업로드) 및 응용 프로그램/x-www- 형태의 혈전 (Post Request)에 대한 처리 코드는 다음과 같습니다.
ProtectedVoid parseparameters () {// 일부 코드를 생략합니다 ... 매개 변수. handleQueryParameters (); // 여기서 URL의 처리 매개 변수는 코드의 일부를 생략합니다 ... if ( "multipart/form-data".equals (contenttype)) {// 여기에 프로세스 파일 업로드 요청 parseparts (); 성공 = 참; 반품; } if (! }} catch (ioexception e) {// 클라이언트 연결을 연결하면 (context.getLogger (). isdebugenabled ()) {context.getLogger (). debug (sm.getString ( "coyoterequest.parseparameters"); } 반품; } parameters.processparameters (FormData, 0, Len); // Post Request 매개 변수를 처리하고 맵에서 요청 파라미터에 넣습니다 (즉, request.getParameTerMap, request.GetParameter (이름) 도이 맵에서 얻은 맵도 얻습니다) // 코드의 파트를 생략 ...} 보호 된 int readPostBody (byte body [], int len) trows ioexception {int offcection = 0; do {int inputlen = getStream (). read (Body, Offset, Len -Offset); if (inputlen <= 0) {return 오프셋; } 오프셋 += inputLen; } while ((Len -Offset)> 0); 반환 렌;} 위의 코드에서 컨텐츠 유형의 사후 요청이 Application/x-WWW-Form-urlencoded가 요청 본문 데이터를 읽지 않고 해당 매개 변수 처리를 수행하지 않음을 알 수 있습니다. 즉, 양식 데이터가 요청 매개 변수 맵에 구문 분석되지 않습니다. 따라서 request.getParameter(name) 를 통해 얻을 수 없습니다.
그렇다면 이런 식으로 제출 된 매개 변수를 어떻게 얻습니까?
물론 아래와 같이 입력 스트림을 읽는 것이 가장 원시적 인 방법입니다.
privatestring getRequestPayload (httpservletRequest req) {StringBuildersB = new StringBuilder (); try (bufferedreaderReader = req.getReader ();) {char [] buff = new char [1024]; intlen; while ((len = reader.read (buff))! = -1) {sb.append (buff, 0, len); }} catch (ioexception e) {e.printstacktrace (); } returnsb.toString ();}물론, Application/X-WWW- 형태 인코딩 된 세트에 대한 사후 요청도 이러한 방식으로 얻을 수 있습니다.
따라서 기본 AJAX Post 요청을 사용할 때는 요청 헤더를 명시 적으로 설정해야합니다.
XHR.SetRequestHeader ( "Content-Type", "Application/X-www-form-urlencoded");
또한 jQuery를 사용하는 경우 1.11.0 버전을 사용하여 테스트합니다. $.ajax post 요청은이 요청 헤더를 명시 적으로 설정할 필요가 없으며 다른 버전에 대해 직접 테스트하지 않았습니다. 1.11.0 이후의 버전은 설정할 필요가 없다고 생각합니다. 그러나 이전에는 확실하지 않을 수 있습니다. 이것은 테스트되지 않았습니다.
추신:
양식 제출 데이터가 이름-값 쌍이고 컨텐츠 유형은 Application/x-WWW-Form-urlencoded이고 파일 업로드 서버는 특수 처리가 필요하기 때문에 서버가 양식 제출 및 파일 업로드를 위해 특수 처리를 수행하는 이유를 실제로 이해했습니다. 일반적인 게시물 요청의 데이터 형식 (콘텐츠 유형은 Application/x-WWW-Form-urlencoded가 아닙니다)은 고정되지 않았으며 반드시 이름 값 쌍이 아니므로 서버는 특정 처리 방법을 알 수 없으므로 원래 데이터 스트림을 얻어만 구문 분석 할 수 있습니다.
JQuery가 게시물 요청을 실행하면 컨텐츠 유형을 Application/X-WWW-Form-urlencoded로 설정하여 서버가 올바르게 구문 분석 할 수 있습니다. 기본 ajax 요청을 사용하는 경우 컨텐츠 유형이 표시되지 않으면 기본값은 텍스트/일반입니다. 현재 서버는 데이터를 구문 분석하는 방법을 알지 못하므로 원래 데이터 스트림을 얻어서 요청 데이터를 구문 분석 할 수 있습니다.
Java 알고리즘에 대한 자세한 내용은이 사이트에 관심이있는 독자들이 주제를 볼 수 있습니다. "Java Network 프로그래밍 기술 요약", "Java 데이터 구조 및 알고리즘에 대한 자습서", "Java 운영 Dom Node Skills 요약", "Java 파일 및 디렉토리 운영 기술 요약"및 "Java Cache 운영 기술 요약".
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.