在Tomcat上读取UTF-8请求的问题

时间:2014-05-26 03:19:23

标签: angularjs tomcat encoding utf-8

我有一个AngularJS应用程序试图将表单提交到部署在Tomcat 7.0.54中的Java后端。我的AngularJS应用程序似乎正在正确提交表单。这是Chrome检查员记录的内容类型标题:

  

内容类型:应用/ JSON;字符集= UTF-8

Chrome检查员再次记录的请求有效负载是:

{"newProject":{"title":"título","deadline":"30/Maio/2014", .....

也就是说,AngularJS应用程序正确地将请求放入线路中。但是,我无法在服务器端正确读取此有效负载。像“í”这样的字符被打印为“?”。

为了测试的目的,我修改了链中的第二个过滤器(第一个是Spring Security)来打印请求的内容。这是为了确保我的服务器端应用程序和我正在使用的任何框架都不会干扰我的数据。

@Override
    public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException {
        try {
            HttpServletRequest hsr = (HttpServletRequest)request;
            if( "POST".equalsIgnoreCase( hsr.getMethod() ) && "http://localhost:8080/profile/createproject".equalsIgnoreCase( hsr.getRequestURL().toString() ) ) {
                hsr.setCharacterEncoding( "UTF-8" );
                BufferedReader reader =  new BufferedReader( new InputStreamReader( request.getInputStream(), "UTF-8" ) );
                System.out.println( reader.readLine() );
            }

            chain.doFilter( request, response );

        } finally {
            MDC.remove( CHAVE_ID_REQUEST );

        }
    }

即使在链的第二个过滤器中读取请求,我也会得到“t?tulo”而不是“título”。如果相同的AngularJS应用程序提交到节点后端,则有效负载将被正确读取并打印在终端中。

有没有人知道Tomcat无法正确读取我的UTF-8请求的原因?

1 个答案:

答案 0 :(得分:0)

好像你已经解决了你的特定问题,但想补充一点,这类问题的关键参考是http://wiki.apache.org/tomcat/FAQ/CharacterEncoding, 在https://stackoverflow.com/a/470320/830737

中引用

特别是,我能够通过在server.xml中的URIEncoding="UTF-8"中设置<Connector>来解决类似的问题。