Манипулировать телом ответа страниц.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.