Este artigo descreve o método de servlet que obtenha parâmetros nas solicitações de postagem do AJAX nos dados do formulário e solicita a carga útil. Compartilhe -o para sua referência, como segue:
Na solicitação HTTP, se for uma solicitação GET, o parâmetro do formulário será anexado à URL na forma de nome = valor e nome1 = value1. Se for uma solicitação de postagem, o parâmetro do formulário estará no corpo da solicitação e também está no corpo da solicitação na forma de nome = value & name1 = value1. Através das ferramentas de desenvolvedor do Chrome, você pode ver o seguinte (aqui está um formulário legível, não um formato de solicitação de protocolo de solicitação HTTP real):
Obtenha solicitação:
RequestUrl: http: //127.0.0.1: 8080/test/test.do? Nome = Mikan & Endereço = StreetRequest Método: GetStatus Código: 200 OkRequest HeaderCept: texto/html, aplicativo/xhtml+xml, aplicativo/xml; q = 0,9, imagem/webp,*/*; q = 0.8 aceitação de codificação: gzip, deflate, sdchaccept-language: zh-cn; PH: Alexatoolbar/alxg-3.2Connection: Keep-alivecookie: JSessionId = 74AC93F9F572980B6FC10474CD8EDD8DHOST: 127.0.0.1: 8080Refer: http: //127.0.0.0.0.1: (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36Query String Parametersname:mikanaddress:streetResponse HeadersContent-Length:2Date:Sun, 11 May 2014 10:42:38 GMTServer:Apache-Coyote/1.1
Solicitação de postagem:
RequestUrl: http://127.0.0.1:8080/test/test.dorquest Método: Código PostStatus: 200 Okrequest HeaderSACECT: texto/html, aplicativo/xhtml+xml, aplicativo/xml; q = 0,9, imagem/webp,*/*; q = 0,8 aceitação de codificação: gzip, deflate, s DCHACCET-LANGUE: ZH-CN, ZH; Q = 0,8, EN; Q = 0.6EXATOOLBAR-ALX_NS_PH: Alexatoolbar/Alxg-3.2cache-Control: Max-Arane = 0Connection : Keep-alivEcontent-Leng: 25Content-Type: Application/X-Www-Form-UrlencodedCookie: JSessionID = 74AC93F9F572980B6FC10474CD8 Edd8dhost: 127.0.0.1: 8080origin: http: //127.0.0.1: 8080Refer: http: //127.0.0.1: 8080/teste/index.jspuser-agente: mozilla/5.0 (Windows NT 6.1) Applewebkit/537.36 (Khtml, como Gecko) Chrome/33.0.1750.149 Safari/537.36form DataName: Mikanaddress: RETRERESPONSETENSONCENTENTENTEM: 2DATE: Sun, 11 de maio de 2014 11:05:3:
Aqui, devemos observar que o tipo de conteúdo da solicitação de postagem é o aplicativo/x-www-forma-urlncoded, e o parâmetro está no órgão de solicitação, ou seja, os dados do formulário na solicitação acima.
Em um servlet, os parâmetros de formulário podem ser obtidos pelo request.getParameter(name) .
E se estiver usando a solicitação de postagem nativa do Ajax:
função getxmlHttPreQuest () {var xhr; if (window.activexObject) {xhr = new ActivexObject ("microsoft.xmlhttp"); } else if (window.xmlHttPrequest) {xhr = new XmlHttPrequest (); } else {xhr = null; } retornar xhr;} função save () {var xhr = getxmlHttPrequest (); xhr.open ("post", "http://127.0.0.1:8080/test/test.do"); var data = "nome = mikan & endereço = rua ..."; xhr.send (dados); xhr.onReadyStateChange = function () {if (xhr.readyState == 4 && xhr.status == 200) {alert ("retornou:"+ xhr.roSponsetext); }};}Através das ferramentas de desenvolvedor do Chrome, consulte o cabeçalho da solicitação da seguinte forma:
RequestUrl: http://127.0.0.1:8080/test/test.dorquest Método: Código PostStatus: 200 Okrequest HeadersAccept:*/*Accept-Encoding:gzip,deflate,sdchAccept-Language:zh-CN,zh;q=0.8,en;q=0.6AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2Connection:keep-aliveContent-Length:28Content-Type:t Ext/Plain; Charset = UTF-8Cookie: JSessionID = C40C7823648E952E7C6F7D2E687A0A89HOST: 127.0.0.1: 8080O Rigin: 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 (Khtml, como Gecko) Chrome/33.0.1750.149 Safari/537.36Request PayloadName = Mikan & Endereço = StreetResponse HeadersContent Dength: 2Date: 1114 11:4 11:4.
Observe que o tipo de conteúdo solicitado é text/plain;charset=UTF-8 , e o parâmetro do formulário de solicitação está no requestPayload.
Então request.getParameter(name) no servlet está vazio. Por que? E como esses parâmetros devem ser obtidos?
Para entender esse problema, procurei algumas informações e li o código -fonte do TOMCAT7.0.53 no processamento de parâmetros de solicitação e, finalmente, descobri o que estava acontecendo.
Ao enviar solicitações de formulário de postagem HTTP, o tipo de conteúdo usado é application/x-www-form-urlencoded e se o cabeçalho do cabeçalho da solicitação não for especificado, o tipo de conteúdo usado por padrão é text/plain;charset=UTF-8 .
Porque o Tomcat faz "processamento especial" para multipart-dados do tipo conteúdo (upload de arquivos) e aplicativo/x-www-forma-urlncoded (solicitação de postagem). Vamos dar uma olhada no código de processamento relevante abaixo.
A classe de implementação da classe HttpServletRequest do Tomcat é org.apache.catalina.connector.request (na verdade org.apache.coyote.request), e seu método de processamento de parâmetros de solicitação é protected void parseParameters() . Os códigos de processamento para multipart/form-dados do tipo conteúdo (upload de arquivos) e aplicativo/x-www-forma-urlncoded (solicitação de postagem) neste método são os seguintes:
ProtectedVoid parseparameters () {// omita algum código ... parameters.HandleQueryParameters (); // Aqui estão os parâmetros de processamento no URL // omitem parte do código ... if ("Multipart/Form-Data" .Equals (ContentType)) {// aqui é o pedido de caixa de processamento de caixa de compasso parsea sucesso = true; retornar; } if (! ("Application/x-www-form-urlencoded" .equals (contentType))) {// Aqui está o processamento dos parâmetros de solicitação de postagem // omitir parte do código ... tente {se readpostbody (formData, len)! = len) {// leia o retorno dos dados do corpo; }} catch (ioexception e) {// Client Desconecte if (context.getLogger (). isDebugenabled ()) {context.getLogger (). Debug (sm.getString ("coyoterequest.pareparameters"), e); } retornar; } parameters.processparameters (formData, 0, len); // Processe o parâmetro de solicitação de postagem e coloque -o no PedidoParameter no mapa (ou seja, o mapa obtido por request.getParameterMap, request.getParameter (nome) também é obtido a partir deste mapa) // omita parte do código ...} Int readPostbody (byte byte [], interiio) throws {} int infset 0; do {int inputlen = getStream (). leia (corpo, deslocamento, len - deslocamento); if (inputlen <= 0) {return offset; } deslocamento += inputlen; } while ((len - deslocamento)> 0); Retornar Len;} A partir do código acima, podemos ver que a solicitação de postagem do tipo Conteúdo não é aplicativo/x-www-forma-urlcoded não lerá os dados do corpo da solicitação e executará o processamento de parâmetros correspondentes, ou seja, os dados do formulário não serão analisados e colocados no mapa de parâmetros de solicitação. Portanto, ele não pode ser obtido através request.getParameter(name) .
Então, como obtemos os parâmetros enviados dessa maneira?
Obviamente, é o método mais primitivo ler o fluxo de entrada para obtê -lo, como mostrado abaixo:
Privatestring getRequestPayload (httpServletRequest req) {stringbuildersB = new StringBuilder (); tente (bufferredreaderReader = req.getReader ();) {char [] buff = new char [1024]; intlen; while ((len = leitor.read (buff))! = -1) {sb.append (buff, 0, len); }} catch (ioexception e) {e.printStackTrace (); } returnsb.toString ();}Obviamente, as solicitações de postagem com o conjunto de aplicativos/x-www-forma-urlcoded também podem ser obtidas dessa maneira.
Portanto, ao usar a solicitação de postagem nativa do Ajax, você precisa definir explicitamente o cabeçalho da solicitação, ou seja::
xhr.setRequestHeader ("Content-Type", "Application/X-Www-Form-Urlencoded"); Além disso, se você usar o jQuery, eu uso a versão 1.11.0 para testá -lo. $.ajax post não precisa definir esse cabeçalho de solicitação explicitamente, e eu não o testei para outras versões. Acredito que as versões após 1.11.0 não precisam ser definidas. Mas alguns antes podem não ter certeza. Isso não foi testado.
PostScript:
Eu realmente entendi por que o servidor faz processamento especial para envio de formulário e upload de arquivos, porque os dados de envio do formulário são um par de nomes-valores, e o tipo de conteúdo é aplicativo/x-www-forma-urlcoded, enquanto o servidor de upload de arquivos precisa de processamento especial. O formato de dados das solicitações de postagens ordinárias (o tipo de conteúdo não é aplicativo/x-www-forma-urlcoded) não é corrigido e não é necessariamente um par de nomes-valor, para que o servidor não possa conhecer o método de processamento específico, portanto, pode analisar apenas a obtenção do fluxo de dados original.
Quando o jQuery executa uma solicitação de postagem, ele define o tipo de conteúdo para o aplicativo/x-www-forma-urlncoded, para que o servidor possa analisar corretamente. Ao usar a solicitação nativa do AJAX, se o tipo de conteúdo não for exibido, o padrão será o texto/simples. No momento, o servidor não sabe analisar os dados, para que ele possa analisar apenas os dados da solicitação, obtendo o fluxo de dados original.
Para obter mais informações sobre os algoritmos Java, os leitores interessados neste site podem visualizar os tópicos: "Resumo das habilidades de programação de rede Java", "Tutoriais sobre estruturas de dados Java e algoritmos", "Resumo de Java Operação Dom Node", "Summary of Java e Operação Operação Skills" e "Summary de Java Node Skills", "Summary Arquivos Java e Skilly Skills" e "Summar
Espero que este artigo seja útil para a programação Java de todos.