How to solve the issue to support UTF-8-encoding of PrintWriter

31 Views Asked by At

There is a response wrapper to replace some contents to another contents like this:

import javax.servlet.ServletOutputStream;
import java.io.CharArrayWriter;
import java.io.IOException;

class ArrayServletOutputStream extends ServletOutputStream {
    private CharArrayWriter charArray;

    public ArrayServletOutputStream(CharArrayWriter charArray) {
        this.charArray = charArray;
    }

    @Override
    public void write(int b) throws IOException {
        charArray.write(b);
    }
}

and the its response wrapper:

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;

class ResponseWrapper extends HttpServletResponseWrapper {
    protected CharArrayWriter charArray = new CharArrayWriter();

    public ResponseWrapper(HttpServletResponse response) {
        super(response);
    }

    @Override
    public PrintWriter getWriter() {
        return new PrintWriter(charArray);
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new ArrayServletOutputStream(charArray);
    }
}

and the filter is :

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class CustomFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ResponseWrapper responseWrapper = new ResponseWrapper((HttpServletResponse) servletResponse);
        filterChain.doFilter(servletRequest, responseWrapper);

        String replacedContent = responseWrapper.charArray.toString(); // Example modification
        replacedContent = replacedContent.replaceAll("S:Envelope", "soap:Envelope");
        replacedContent = replacedContent.replaceAll("S:Body", "soap:Body");
        replacedContent = replacedContent.replaceAll("xmlns:S", "xmlns:soap");
        replacedContent = replacedContent.replace("<?xml version='1.0' encoding='UTF-8'?>", "");
        servletResponse.setContentLength(replacedContent.length());
        PrintWriter out = servletResponse.getWriter();
        out.write(replacedContent);
    }

    @Override
    public void destroy() {

    }
}

So it is working but the characterset is not UTF-8 and another word the ResponseWrapper does not support the UTF-8 encoding.

How do I solve the problem?

thanks in advance to whom help me

0

There are 0 best solutions below