Как заставить простейший фильтр сервлетов соблюдать установленную кодировку символов - PullRequest
2 голосов
/ 10 февраля 2012

Такое ощущение, что я застрял.Я пытаюсь написать простейший фильтр сервлетов (и развернуть его в 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.Итак, тип контента изменился, но кодировка игнорируется.

Как вы можете видеть, я принял некоторые меры (я полагаю, довольно наивно), чтобы убедиться, что контент - UTF-8, но на самом деле ни один из этих шаговбыло полезно.

Я также пытался добавить атрибуты URIEncoding="UTF-8" или useBodyEncodingForUri="true" к Соединителю в tomcat conf / server.xml

Было бы хорошо, если бы кто-то объяснил мне, что я 'я делаю неправильно.

UPD: просто небольшое объяснение - я пишу фильтр, применяющий XSLT, и это настоящая причина, по которой я пытаюсь отбросить весь запрос.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012
def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!'
def bytes = saw.getBytes('UTF-8')
def content = new String(bytes, 'UTF-8')

Ничего не меняет между пилой и содержанием. То, что вы хотите сделать (использовать outputtream и , а не устройство записи , поэтому кодировка сбрасывается на 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"));

}   
1 голос
/ 10 февраля 2012

Вы пытаетесь установить тип содержимого после фиксации ответа, вызывая getWriter.Подробнее см. Документацию по getWriter и setCharacterEncoding .

Чтобы исправить код, просто переместите настройку типа контента и кодировку несколькими строками ранее.

    response.setCharacterEncoding('UTF-8')
    response.setContentType('text/plain')
    PrintWriter out = response.getWriter()
1 голос
/ 10 февраля 2012

Это может быть ваша проблема, или, по крайней мере, это одна из проблем. В документации setCharacterEncoding() сказано:

Этот метод не имеет эффекта, если он вызывается после того, как getWriter был вызван или после того, как ответ был принят.

Вы должны установить кодировку, и только после , получите писателя.

...