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>" );
}
}