如何使最简单的servlet过滤器尊重设置字符编码

时间:2012-02-10 16:05:19

标签: java tomcat groovy character-encoding

感觉好像被卡住了。 我正在尝试编写最简单的servlet Filter(并将其部署到tomcat)。这是一个时髦的代码,但实际上我在这里大量使用java方法,所以它几乎是复制粘贴,这也是我添加了java标记的原因。

我的问题是 - 如何将UTF-8字符串插入过滤器? 这是代码:

public class SimpleFilter implements javax.servlet.Filter

{
    ...
    public void doFilter(ServletRequest request, ServletResponse response,
           FilterChain chain) 
           throws java.io.IOException, javax.servlet.ServletException
    {   
            PrintWriter out = response.getWriter()
            chain.doFilter(request, wrapResponse((HttpServletResponse) response))

            response.setCharacterEncoding('UTF-8')
            response.setContentType('text/plain')

            def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!'
            def bytes = saw.getBytes('UTF-8')
            def content = new String(bytes, 'UTF-8')

            response.setContentLength(content.length())
            out.write(content);
            out.close();
    }   

    private static HttpServletResponse  wrapResponse(HttpServletResponse response) {
        return new HttpServletResponseWrapper(response) {
            @Override
            public PrintWriter getWriter() {
                 def writer  = new OutputStreamWriter(new ByteArrayOutputStream(), 'UTF-8')
                 return new PrintWriter(writer)
            }   
        }   
    }   
}

内容 - 已过滤页面的类型为text/plain;charset=ISO-8859-1。 因此,内容类型已更改,但charset被忽略。

正如你所看到的,我采取了一些措施(我觉得很天真)来确保内容是UTF-8,但这些步骤都没有帮助。

我还尝试添加URIEncoding="UTF-8"useBodyEncodingForUri="true"属性 tomcat conf / server.xml中的连接器

如果有人向我解释我做错了什么会很好。

UPD:只是一些解释 - 我正在编写XSLT应用过滤器,这是我试图放弃整个请求的真正原因。

3 个答案:

答案 0 :(得分:2)

def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!'
def bytes = saw.getBytes('UTF-8')
def content = new String(bytes, 'UTF-8')

不会改变锯和内容之间的东西。您想要做的是(使用输出流而非作者,这就是为什么将字符集重置为ISO-8859-1 See tomcat doc):< / p>

out.write(saw.getBytes("UTF-8);

您的代码看起来可以将字符集设置为UTF-8。

我不明白你在用HttpResponseWrapper做什么。

为清楚起见,这将有效:

public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) 
   throws java.io.IOException, javax.servlet.ServletException
{   
    OutputStream out = response.getOutputStream()

    response.setCharacterEncoding('UTF-8')
    response.setContentType('text/plain')

    def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!'

    response.setContentLength(saw.length())
    out.write(content.getBytes("UTF-8"));

}   

答案 1 :(得分:1)

这可能是你遇到的问题,或者至少它是问题的一部分。正如setCharacterEncoding()的文档所说:

  

如果在getWriter之后调用此方法,则此方法无效   在响应被提交之后或之后。

您应该设置编码,,只有在之后才能获得编辑。

答案 2 :(得分:1)

您尝试通过调用getWriter提交响应后设置内容类型。 有关详细信息,请参阅getWritersetCharacterEncoding上的文档。

要修复代码,只需移动内容类型设置并稍早编码几行。

    response.setCharacterEncoding('UTF-8')
    response.setContentType('text/plain')
    PrintWriter out = response.getWriter()