Skip to main content

How to make simplest servlet filter respect setted character encoding



Gentlemen, 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 usin java approaches here, so it is almost copypaste, 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 exlain 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.


Comments

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

    }

    ReplyDelete
  2. This might be the problem you're having, or at least it's one part of the problem. As the documentation of setCharacterEncoding() says:


    This method has no effect if it is called after getWriter has been
    called or after the response has been committed.


    You should set the encoding, and only after, get the writer.

    ReplyDelete
  3. You are trying to set the content type after committing the response by calling getWriter.
    See the documentation on getWriter and setCharacterEncoding for details.

    To fix you code just move the setting of content type and encoding a few lines earlier.

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

    ReplyDelete

Post a Comment

Popular posts from this blog

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex