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

Slow Android emulator

I have a 2.67 GHz Celeron processor, 1.21 GB of RAM on a x86 Windows XP Professional machine. My understanding is that the Android emulator should start fairly quickly on such a machine, but for me it does not. I have followed all instructions in setting up the IDE, SDKs, JDKs and such and have had some success in staring the emulator quickly but is very particulary. How can I, if possible, fix this problem?

CCNA 3 Final Exam => latest version

1 . Which security protocol or measure would provide the greatest protection for a wireless LAN? WPA2 cloaking SSIDs shared WEP key MAC address filtering   2 . Refer to the exhibit. All trunk links are operational and all VLANs are allowed on all trunk links. An ARP request is sent by computer 5. Which device or devices will receive this message? only computer 4 computer 3 and RTR-A computer 4 and RTR-A computer 1, computer 2, computer 4, and RTR-A computer 1, computer 2, computer 3, computer 4, and RTR-A all of the computers and the router   3 . Refer to the exhibit. Hosts A and B, connected to hub HB1, attempt to transmit a frame at the same time but a collision occurs. Which hosts will receive the collision jamming signal? only hosts A and B only hosts A, B, and C only hosts A, B, C, and D only hosts A, B, C, and E   4 . Refer to the exhibit. Router RA receives a packet with a source address of 192.168.1.65 and a destination address of 192.168.1.161...