Hello, The reader that HttpServletRequest#getReader returns seems to decode characters not using the character encoding set by ServletContext#setRequestCharacterEncoding(since Servlet 4.0).
My questions are: 1. Is this behavior intentional(e.g. for backward compatibility)? 2. If this behavior is intentional, is there any specification describing such ServletContext#setRequestCharacterEncoding and HttpServletRequest#getReader behaviors? I have created a simple war application and tested ServletContext#setRequestCharacterEncoding as follows. [Environment] Tomcat9.0.19 (I don't change any default configuration) JDK11 Windows8.1 [index.html] ##################################################################### <button type="button" id="the_button">post</button> <script> document.getElementById('the_button').addEventListener('click', function() { var xhttp = new XMLHttpRequest(); xhttp.open('POST', '/SimpleWarApp/app/simple'); xhttp.setRequestHeader('Content-Type', 'text/plain'); <!-- The body content is Japanese character '\u3042' --> xhttp.send('あ'); }); </script> ##################################################################### [InitServletContextListener.java] ##################################################################### @WebListener public class InitServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { sce.getServletContext().setRequestCharacterEncoding("UTF-8"); } } ##################################################################### [SimpleServlet.java] ##################################################################### @WebServlet("/app/simple") @SuppressWarnings("serial") public class SimpleServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("requestCharacterEncoding : " + req.getServletContext().getRequestCharacterEncoding()); System.out.println("req.getCharacterEncoding() : " + req.getCharacterEncoding()); String hello = req.getParameter("hello"); if (hello != null) { System.out.println("hello : " + req.getParameter("hello")); } else { System.out.println("body : " + req.getReader().readLine()); } } } ##################################################################### I don't have any servlet filters. The above three are all the components of this war application. Here are the war application's console logs. Case 1: When I submit the form with a parameter 'hello', the value of 'hello' is successfully decoded as follows. ##################################################################### requestCharacterEncoding : UTF-8 req.getCharacterEncoding() : UTF-8 hello : あ ##################################################################### Case 2: When I click 'post' and send text content, the request body cannot be successfully decoded as follows. ##################################################################### requestCharacterEncoding : UTF-8 req.getCharacterEncoding() : UTF-8 body : ??? ##################################################################### Case 1 is OK, but at Case 2, I expect for the request body to be successfully decoded by the character encoding set by ServletContext#setRequestCharacterEncoding. I originally posted the issue on StackOverflow. There are a bit of more information there: https://stackoverflow.com/questions/56087155/why-servletcontextsetrequestcharacterencoding-does-not-have-an-effect-on-htt Thanks, Tomoki