3

GlassFish 4 で奇妙な問題が発生しました。生データを POST リクエスト (jQuery を使用) でサーブレットに送信しています。request.getReader() を介して doPost でデータを読み取ると、リーダーが空であるため失敗します (-1 がすぐに返されます)。しかし、コードを変更すると:

Reader reader = request.getReader();

に:

BufferedReader reader = new BufferedReader( new InputStreamReader( request.getInputStream() ) );

成功です。Tomcat 6、7 または Jetty を使用する場合、request.getReader() は空ではないことに注意してください。GlassFish 4 のどこが悪いのか、誰にも分かりませんか? 問題を示す完全な簡単なスニペットを次に示します。

package test.servlet;

import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

  @Override
  protected void doGet( HttpServletRequest request, HttpServletResponse response )
    throws ServletException, IOException
  {
    writeInitialPage( response );
  }

  @Override
  protected void doPost( HttpServletRequest request,
                         HttpServletResponse response )
    throws ServletException, IOException
  {
    writeData( response, readData( request ) );
  }

  private void writeData( HttpServletResponse response, String data ) throws IOException {
    Writer writer = response.getWriter();
    for( int i = 0; i < data.length(); i++ ) {
      writer.write( data.charAt( i ) );
    }
  }

  private String readData( HttpServletRequest request ) throws IOException {
    Reader reader = request.getReader();
//    BufferedReader reader = new BufferedReader( new InputStreamReader( request.getInputStream() ) );
    StringBuilder buffer = new StringBuilder();
    int current = reader.read();
    while( current != -1 ) {
      char ch = ( char )current ;
      buffer.append( ch );
      current = reader.read();
    }
    reader.close();
    return buffer.toString();
  }

  private void writeInitialPage( HttpServletResponse response ) throws IOException {
    Writer writer = response.getWriter();
    writer.write( "<html>" );
    writer.write( "<head>" );
    writer.write( "<script type=\"text/JavaScript\" src=\"/test/js/jquery-1.10.2.min.js\"></script>" );
    writer.write( "</head>" );
    writer.write( "<body>" );
    writer.write( "<button type=\"button\" onclick=\"" );
    writer.write( "$.ajax('/test/test',{" );
    writer.write( "'data': 'data1 data2 data3 data4 data5 data6 data7 data8 data9 data10'," );
    writer.write( "'type': 'POST'," );
    writer.write( "'processData': false," );
    writer.write( "'contentType': 'text/plain'" );
    writer.write( "});" );
    writer.write( "\">Send</button>" );
    writer.write( "</body>" );
    writer.write( "</html>" );
  }

}
4

0 に答える 0