В этой статье описывается метод получения параметров сервлета в запросах AJAX POST в данных формы и полезной нагрузки. Поделитесь этим для вашей ссылки, следующим образом:
В HTTP -запросе, если он является запросом GET, параметр формы прикреплен к URL в форме name = value & name1 = value1. Если это запрос POST, параметр формы находится в корпусе запроса, а также находится в корпусе запроса в форме name = value & name1 = value1. Через инструменты разработчика Chrome вы можете увидеть следующее (вот читаемая форма, а не реальный формат запроса протокола запроса HTTP):
Получить запрос:
RequestUrl: http: //127.0.0.1: 8080/test/test.do? Name = mikan & address = streetRequest Метод: GetStatus код: 200 Ofrequest HeadersAccept: Text/html, Application/xhtml+xml, Application/xml; q = 0,9, изображение/webp,*/*; q = 0,8cect-encoding: gzip, deflate, sdchaccept-language: zh-cn, zh; q = 0,8, en; q = 0,6alexoolbar-alx_ns_ PH: Alexatoolbar/Alxg-3.2Connection: Keep-AliveCookie: JSessionId = 74AC93F9F572980B6FC10474CD8EDD8DHOST: 127.0.0.1: 8080Reerer: http: //127.0.0.1: 8080/test/index.jspuser-agent: mozilla/5.0 (Wickes nt 6.1) Applewebkit/537.36 (khtml, как гекко) Chrome/33.0.1750.149 Safari/537.36 КОРЕЙС
Запрос публикации:
RequestUrl: http://127.0.0.1:8080/test/test.dorequest Метод: Poststatus Code: 200 Ofrequest HeadersAccept: Text/html, Application/xhtml+XML, Application/xml; q = 0,9, Image/webp,*/*; q = 0.8accept-encoding: gzip, deflate, s dchaccect-language: zh-cn, zh; q = 0,8, en; q = 0,6alexatoolbar-alx_ns_ph: alexatoolbar/alxg-3.2cache-control: max-age = 0connection : Длина Keep-AliveContent: 25Content-Type: Application/X-WWW-Form-UrlencodeDcookie: JSessionId = 74AC93F9F572980B6FC10474CD8 Edd8dhost: 127.0.0.1: 8080origin: http: //127.0.0.1: 8080Reerer: http: //127.0.0.1: 8080/test/index.jspuser-agent: mozilla/5.0 (Windows NT 6.1) AppleWebkit/537.36 (khtml, как гекко) Chrome/33.0.1750.149 Safari/537.36 Формирование данных: Mikanaddress: StreetResponse HeadersContent-Length: 2date: Sun, 11 мая 2014 г.
Здесь мы должны отметить, что тип контента запроса POST является Application/X-WW-FORM-URLENCODED, а параметр находится в корпусе запроса, то есть данные формы в вышеуказанном запросе.
В сервлете параметры формы могут быть получены с помощью request.getParameter(name) .
И при использовании нативного запроса Post Ajax:
функция getXmlhttprequest () {var xhr; if (window.activexobject) {xhr = new activexobject ("microsoft.xmlhttp"); } else if (window.xmlhttprequest) {xhr = new xmlhttprequest (); } 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 ("return:"+ xhr.responsetext); }};}Через инструменты разработчика Chrome см. Заголовок запроса следующим образом:
RequestUrl: http://127.0.0.1:8080/test/test.dorequest Метод: Poststatus Code: 200 Ofrequest HeadersAccept:*/*Принятие-кодирование: gzip, deflate, sdchaccept-language: zh-cn, zh; q = 0,8, en; q = 0,6alexatoolbar-alx_ns_ph: alexatoolbar/alxg-3.2conection: keep-alivecontent-legence: 28content-type: t ext/plain; charset = utf-8cookie: jsessionid = c40c7823648e952e7c6f7d2e687a0a89host: 127.0.0.1: 8080o RIGIN: http: //127.0.0.1: 8080Reerer: http: //127.0.0.1: 8080/test/index.jspuser-agent: mozilla/5.0 (Windows NT 6.1) AppleWebkit/537.36 (khtml, как гекко) Chrome/33.0.1750.149 Safari/537.36Request PayLoadName = Mikan & Address = StreetResponse Headerscontent-Length: 2date: Sun, 11 мая 2014 11:49:23 Gmtserver: APOYCE-ol-ol-ol-ol-ol-ol-ol-olcoyte: 1.
Обратите внимание, что запрашиваемый тип контента-это text/plain;charset=UTF-8 , а параметр формы запроса находится в загрузке запроса.
Затем request.getParameter(name) в сервлете пуст. Почему? И как получить такие параметры?
Чтобы понять эту проблему, я посмотрел некоторую информацию и прочитал исходный код Tomcat7.0.53 при обработке параметров запроса и, наконец, выяснил, что происходит.
При отправке запросов формы сообщений HTTP используемый тип контента-это application/x-www-form-urlencoded , и, если не указан головой заголовок запроса, то тип контента, используемый по умолчанию, является text/plain;charset=UTF-8 .
Потому что Tomcat делает «специальную обработку» для Multipart/Form-Data (загрузка файла) и Application/xwww-form-urlencoded (Post запрос). Давайте посмотрим на соответствующий код обработки ниже.
Класс реализации класса Tomcat HttpservlectRequest - это org.apache.catalina.connector.request (фактически org.apache.coyote.request), а его метод параметров запроса обработки protected void parseParameters() . Коды обработки для Multipart/Form-Data (загрузка файла) и Application/x-Www-Form-UrlencoDed (POST запрос) в этом методе следующие:
ProtectectedVoid parseParameters () {// Опустить какой-то код ... parameters.handlequeryparameters (); // Вот параметры обработки в URL // Опустить часть кода ... if ("Multipart/Form-Data" .Quals (ContentType)) {// Вот файл обработки засыпания ParseParts (); Успех = правда; возвращаться; } if (! ("Приложение/x-Www-form-urlencoded" .equals (contentType))) {// Вот обработка параметров запроса post // опустить часть кода ... попробуйте {if (readpostbody (formdata, len)! = len) {// Читать данные о обработке данных запроса; }} catch (ioException e) {// client dinsnect if (context.getlogger (). isdebugenabled ()) {context.getlogger (). Debug (sm.getString ("coyoteRequest.parseParameters"), e); } возвращаться; } параметры. ProcessParameters (FormData, 0, Len); // Обработайте параметр запроса post и поместите его в запрос параметра в карте (то есть карта, полученная по запросу.getParametermap, request.getParameter (имя) также получена с этой карты) // Опустить часть кода ...} Защищенное int readpostbodebode (byte body [], int len) throws {int offsset = 0; do {int inputlen = getStream (). Read (Body, Offset, Len - Offset); if (inputlen <= 0) {return offset; } offset += inputLen; } while ((len - offset)> 0); вернуть Лен;} Из приведенного выше кода мы видим, что запрос Post of Content-Type не является Application/xww-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 ();}Конечно, запросы POST с помощью Application/X-WWW-FORM-URLENCODED также могут быть получены таким образом.
Следовательно, при использовании собственного запроса Post Ajax вам необходимо явно установить заголовок запроса, то есть:
xhr.setrequestheader ("контент-тип", "Application/xww-form-urlencoded"); Кроме того, если вы используете jQuery, я использую версию 1.11.0 для ее проверки. $.ajax post не должен явно устанавливать этот заголовок запроса, и я сам не проверял его на другие версии. Я считаю, что версии после 1.11.0 не должны быть установлены. Но некоторые раньше не могут быть уверены. Это не было проверено.
PostScript:
Я действительно понял, почему сервер выполняет специальную обработку для подчинения форм и загрузки файлов, потому что данные подачи формы являются парой именных значений, а тип контента-это приложение/xww-form-urlencodied, в то время как сервер загрузки файла нуждается в специальной обработке. Формат данных обычных запросов POST (тип контента не является приложением/XWW-FORM-URLENCODED) не является фиксированным, и он не обязательно является парой именных значений, поэтому сервер не может знать конкретный метод обработки, поэтому он может анализироваться только путем получения исходного потока данных.
Когда jQuery выполняет запрос POST, он устанавливает тип контента на Application/X-WW-FORM-URLENCODED, поэтому сервер может правильно разрабатывать. При использовании нативного запроса AJAX, если тип контента не отображается, по умолчанию текст/проста. В настоящее время сервер не знает, как анализировать данные, поэтому он может анализировать данные запроса, только получая исходный поток данных.
Для получения дополнительной информации об алгоритмах Java, читатели, которые заинтересованы в этом сайте, могут просмотреть темы: «Сводка навыков программирования сети Java», «Учебные пособия по структурам данных и алгоритмам Java», «Сводка навыков операции Java Dom Node», «Сводка навыков файла Java File и Directory навыки операции Java CACH
Я надеюсь, что эта статья будет полезна для всех Java Programming.