Манипулировать телом ответа страниц.html и.jsp

Поэтому я использовал этот код, чтобы получить тело ответа (исходный код страницы, к которой обращались) для страницы.jsp
Может кто-нибудь, пожалуйста, помогите мне, как мне извлечь тело ответа для.html страницы.

public class DetailFilter implements Filter {
    private FilterConfig config;
    public DetailFilter() {
        super();
    }

    public void init(final FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
    }


    public void destroy() {
        config = null;
    }

    public void doFilter(final ServletRequest request, final ServletResponse response,
                         final FilterChain chain) throws IOException, ServletException {

        ServletResponse newResponse = response;

        if (request instanceof HttpServletRequest) {
            newResponse = new CharResponseWrapper((HttpServletResponse) response);
        }

        chain.doFilter(request, newResponse);

        if (newResponse instanceof CharResponseWrapper) {
            String text = newResponse.toString();

            if (text != null) {
                response.getWriter().write(text);
                System.out.println("text is: "+text);
            }
        }
    }
}


public class CharResponseWrapper extends HttpServletResponseWrapper{
    protected CharArrayWriter charWriter;

    protected PrintWriter writer;

    protected boolean getOutputStreamCalled;

    protected boolean getWriterCalled;

    public CharResponseWrapper(HttpServletResponse response) {
        super(response);

        charWriter = new CharArrayWriter();
    }

    public ServletOutputStream getOutputStream() throws IOException {
        if (getWriterCalled) {
            throw new IllegalStateException("getWriter already called");
        }

        getOutputStreamCalled = true;
        return super.getOutputStream();
    }

    public PrintWriter getWriter() throws IOException {
        if (writer != null) {
            return writer;
        }
        if (getOutputStreamCalled) {
            throw new IllegalStateException("getOutputStream already called");
        }
        getWriterCalled = true;
        writer = new PrintWriter(charWriter);

        return writer;
    }

    public String toString() {
        String s = null;
        if (writer != null) {
            s = charWriter.toString();
        }
        System.out.println("tosting is:"+s);
        return s;
    }
}

Проблема заключается в том, что для страницы.jsp вызывается метод getWriter() (в CharResponseWrapper), а в Writer возвращается значение, а для страницы.html вызывается ServletOutputStream, и он возвращает нулевое значение.

Я также попробовал URLConnection и InputStreamReader для того же самого. Код, который я использовал, упомянут ниже

HttpServletRequest hReq = (HttpServletRequest) request;
StringBuffer ss=hReq.getRequestURL();
String u=ss.toString();
URL url = new URL(u);
URLConnection con = url.openConnection();
System.out.println("Connection successful");
InputStream is =con.getInputStream();
System.out.println("InputStream Successful");
BufferedReader br = new BufferedReader(new InputStreamReader(is));

String line = null;
String[] arr={};
while ((line = br.readLine()) != null) {
    System.out.println(line);
}

Код работает хорошо и печатает "Соединение успешно" на консоли, но затем он работает как бесконечный цикл и никогда не выполняет "InputStream Successful". Насколько я понимаю, когда соединение создается, когда мы вызываем InputStream, он отправляет запрос на один и тот же URL, и весь процесс повторяется снова и снова. Может быть, этот процесс работает только для определенного URL, например, url="www.abcd.com"

Я хочу извлечь тело ответа.html страницы для некоторых манипуляций с данными. любая помощь по этому плз.

РЕДАКТИРОВАТЬ

Чтобы продолжить этот вопрос, после того как я получу ответ тела. Я вставляю JS перед тегом. Когда я SOP этой строки, я вижу вставленное тело ответа. До этого шага все в порядке. Я конвертирую его в байтовый массив и записываю байтовый массив в экземпляр servletoutputstream.

ServletOutputStream newResponse1= response.getOutputStream();
newResponse1.write(bArray);
newResponse1.close();

где bArray - тело ответа со вставленным JS в формате байтового массива. ответ является ServletResponse. Вывод, который я получаю, странный. Страница JSP выполняется дважды. Означает, если у меня есть кнопка на странице JSP, она показывает ту же кнопку два раза, и выполняется JS. HTML-страница выполняется один раз, но этот окончательный ответ - не тот ответ, который я написал. означает, что записанные мной данные bArray (введенные данные) - это не тот ответ, который я вижу в браузере.

Я чувствую, что мне нужно переопределить метод getOutputStream снова, что, к сожалению, я не могу. Пожалуйста помоги. вернуться, если вопрос не ясен.

Я также воспользовался ссылкой Как читать и копировать содержимое потока вывода ответа сервлета HTTP для ведения журнала.

1 ответ

Решение

Вам необходимо перехватить вывод, доставленный в базовый ServletOutputStreamтаким же образом CharArrayWriter делает. Итак, я рекомендую вам изменить getOutputStream метод для инкапсуляции возвращенного объекта в ваш собственный экземпляр ServletOutputStream и сохранения его как переменной экземпляра CharResponseWrapper (такой же как CharArrayWriter). Было бы достаточно быть так:

public class MyServletOutputStream extends ServletOutputStream
{
    private final ServletOutputStream src;

    private final StringBuilder stb=new StringBuilder(4096);

    public MyServletOutputStream(ServletOutputStream src)
    {
        super();
        this.src=src;
    }

    @Override
    public void write(int b)
        throws IOException
    {
        this.src.write(b);
        this.stb.append((char)b);
    }

    public StringBuilder getStb()
    {
        return this.stb;
    }
}

Наконец, измените toString метод, чтобы решить, из какого объекта он должен получить данные: CharArrayWriter или MyServletOutputStream.

Другие вопросы по тегам