Tale: Postar um artigo, incluindo "=", "&", resultando em falha ao salvar

Criado em 18 dez. 2019  ·  6Comentários  ·  Fonte: otale/tale

Depois de fazer login em segundo plano, escrevi um artigo. Como algumas descrições exigem código, inseri trechos de código.
Quando o resultado foi salvo, verificou-se que um erro foi relatado em segundo plano.
io.netty.handler.codec.http.multipart.HttpPostRequestDecoder$ErrorDataDecoderException: java.io.IOException: Unable to create temporary file, C:\Users\pys1714\AppData\Local\Temp\Attr_7771572786958116046_{"cid":4,"title":
Vendo um erro, inicialmente pensei que a estratégia para salvar era armazenar em cache como um arquivo, e havia uma limitação no tamanho dos dados, então comecei a deletar o texto e depurar. Descobri que parece não haver nenhum arquivo temporário gerado. Portanto, suspeitei que fosse algum motivo para criar o arquivo.

De acordo com o erro, encontre o método subjacente io.netty.handler.codec.http.multipart.HttpPostRequestDecoder.parseBodyAttributes()

Depois de observar o método, descobri que o netty estava lendo os dados que eu transmitia e fazendo algum tipo de julgamento um por um.

switch (currentStatus) {
case DISPOSITION:// search '='
     // other code
    break;
case FIELD:// search '&' or end of line
    // other code
    break;
default:
    // just stop
    sao.setReadPosition(0);
    contRead = false;
    break loop;
}

Notei que o comentário diz para consultar dois caracteres "=" e "&". Com uma tentativa, meu artigo contém apenas "=", clique em salvar e um erro é relatado conforme o esperado:
io.netty.handler.codec.http.multipart.HttpPostRequestDecoder$ErrorDataDecoderException: java.io.IOException: 文件名、目录名或卷标语法不正确。
Tentei "&" novamente, e o fiz.

Ainda não tenho uma solução específica, pois o erro é um método privado do netty.

Comentários muito úteis

Encontrou uma solução, https://juejin.im/post/5c63a028f265da2d9262c662

O método específico é,

  1. Crie um pacote em src / main / java: io.netty.handler.codec.http.multipart

  2. Encontre HttpPostStandardRequestDecoder.java no código-fonte correspondente a netty-codec-http-4.1.30.Final.jar

  3. Copie o código-fonte para o pacote criado na primeira etapa

  4. Encontre parseBodyAttributes() e adicione o seguinte código à primeira linha do método:

if(!this.request.headers().get("Content-Type").startsWith(APPLICATION_X_WWW_FORM_URLENCODED)){
          return;
}
  1. Use o comando maven do pacote para empacotar o conto

Todos 6 comentários

Encontrou uma solução, https://juejin.im/post/5c63a028f265da2d9262c662

O método específico é,

  1. Crie um pacote em src / main / java: io.netty.handler.codec.http.multipart

  2. Encontre HttpPostStandardRequestDecoder.java no código-fonte correspondente a netty-codec-http-4.1.30.Final.jar

  3. Copie o código-fonte para o pacote criado na primeira etapa

  4. Encontre parseBodyAttributes() e adicione o seguinte código à primeira linha do método:

if(!this.request.headers().get("Content-Type").startsWith(APPLICATION_X_WWW_FORM_URLENCODED)){
          return;
}
  1. Use o comando maven do pacote para empacotar o conto

Hmm, depois de pesquisar por um longo tempo, descobri que a camada inferior do Blade relatou um erro. O coração está partido. Experimente primeiro o seu método.obrigado

Obrigado pelo método, mas lendo o código, não entendi o princípio. .Expressando ignorância

Atualize a dependência do Blade netty
<dependency> <groupId>io.netty</groupId> <artifactId>netty-codec</artifactId> <version>4.1.31.Final</version> </dependency>

Atualize a dependência do Blade netty
<dependency> <groupId>io.netty</groupId> <artifactId>netty-codec</artifactId> <version>4.1.31.Final</version> </dependency>

Tentei, o que significa que o problema não tem solução. . .

Encontrou uma solução, https://juejin.im/post/5c63a028f265da2d9262c662

O método específico é,

  1. Crie um pacote em src / main / java: io.netty.handler.codec.http.multipart
  2. Encontre HttpPostStandardRequestDecoder.java no código-fonte correspondente a netty-codec-http-4.1.30.Final.jar
  3. Copie o código-fonte para o pacote criado na primeira etapa
  4. Encontre parseBodyAttributes() e adicione o seguinte código à primeira linha do método:
if(!this.request.headers().get("Content-Type").startsWith(APPLICATION_X_WWW_FORM_URLENCODED)){
          return;
}
  1. Use o comando maven do pacote para empacotar o conto
if(!this.request.headers().get("Content-Type").startsWith(APPLICATION_X_WWW_FORM_URLENCODED)){
          return;
}

Este parâmetro está inativo ↓

if(!this.request.headers().get("Content-Type").startsWith("application/x-www-form-urlencoded")){
            return;
 }

Solução perfeita👍
A(G1% (QH{7~MTO)O438YC5
A(G1% (QH{7~MTO)O438YC5

Esta página foi útil?
0 / 5 - 0 avaliações