如何使最简单的servlet过滤器尊重设置的字符编码 [英] How to make simplest servlet filter respect setted character encoding

查看:85
本文介绍了如何使最简单的servlet过滤器尊重设置的字符编码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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

  public class SimpleFilter implements javax.servlet.Filter 

{
...
public void doFilter(ServletRequest请求,ServletResponse响应,
FilterChain链)
抛出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响应){
返回新的HttpServletResponseWrapper(响应){
@Override
public PrintWriter getWriter(){
def writer = new OutputStreamWriter(new ByteArrayOutputStream(),'UTF-8')
return new PrintWriter(writer)
}
}
}
}

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



正如你所看到的,我已经采取了一些措施肯定的内容是UTF-8,但这些步骤实际上都没有帮助。



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

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

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

解决方案

<$ p $ '
def bytes = saw.getBytes('UTF-8')
def content = new String(bytes, 'UTF-8')

不会改变锯和内容之间的东西。你想要做什么(使用 outputstream 不是作者,这就是为什么字符集重置为ISO-8859-1 查看tomcat文档):

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

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



我不明白你在用HttpResponseWrapper 。



为了说清楚,这将起作用:

  public void doFilter(ServletRequest请求,ServletResponse响应,
FilterChain链)
抛出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));

}


It feels like I'm stuck. I'm trying to write the simplest servlet Filter (and deploy it to tomcat). It's a groovy code, but actually I'm heavily using java approaches here, so it is almost copy-paste, that's the reason I've added java tag as well.

My question is - how can I insert UTF-8 string to filter? Here is the code:

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 of the filtered page is text/plain;charset=ISO-8859-1. So, content type have changed, but charset is ignored.

As you can see, I've take some measures (I guess quite naive) to make sure content is UTF-8, but none of these steps actually was helpful.

I've also tried to add URIEncoding="UTF-8" or useBodyEncodingForUri="true" attributes to Connector in tomcat conf/server.xml

It would be nice if somebody explained me what I'm doing wrong.

UPD: just a bit of explanation - I'm writing XSLT-applying filter, that is the real reason I'm trying to discard whole request.

解决方案

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

Does not change a thing between saw and content. What you want is to do (using the outputstream and not the writer, this is why the charset is reset to ISO-8859-1 See tomcat doc):

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

Your code looks okay to set the charset as UTF-8.

I don't understand what you are doing with HttpResponseWrapper.

To make it clear, this will work:

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

}   

这篇关于如何使最简单的servlet过滤器尊重设置的字符编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆