一尘不染

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

tomcat

感觉就像我被卡住了。我正在尝试编写最简单的Servlet过滤器(并将其部署到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)
            }   
        }   
    }   
}

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

如您所见,我已经采取了一些措施(我想很幼稚)来确保内容为UTF-8,但是这些步骤实际上都没有帮助。

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

如果有人向我解释我做错了,那将是很好的。

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


阅读 317

收藏
2020-06-16

共1个答案

一尘不染

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

在锯片和内容之间不会发生变化。您想要做的是(使用 outputstream不是writer
,这就是为什么将字符集重置为ISO-8859-1的原因,请参见tomcat
doc
):

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

}
2020-06-16