Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоковые фильтры, как сделать? 
:(
    Опции темы
Се ля ви
Дата 29.3.2005, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Недавно стал изучать фильтры.
Насколько я понял, они должны полностью принять весь запрос, что бы его обработать и передать дальше тоже полностью. Т.е. они не потоковые, а именно последовательные.

Грубо говоря, они отвечают мировоззрению модели DOM в XML`е - весь ответ сервера загрузили, распарсили, изменили, после этого отправили дальше.

А можно ли реализовать что-то типа SAX-модели, а лучше просто потоковой? Т.е. сервлет возвращает, ведь, HTTP-ответ потоком, а не целым куском сразу - и мы бы читали этот поток и передавали его в фильтре дальше по мере поступления, в цикле, например так:
Код
String s = new String();

while ( (s = response.readLine()) != null ) {
    if (s.equals("</body>"))
        s = "buy!</body>";
    response.sendLine(s);
}

Как-то так можно или нет?.. А то по классической модели получается, что пока фильтр не отработает, клиент вообще ничего не увидит - а передача тоже ведь время ест... smile

Это сообщение отредактировал(а) Се ля ви - 29.3.2005, 11:28


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
3,14
Дата 29.3.2005, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24





--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Се ля ви
Дата 29.3.2005, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Нет, я про J2EE фильтры. Они по сути как сервлеты, только для пре- и пост-обработки основного запроса используются...


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Се ля ви
Дата 30.3.2005, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Так что - никто не знает?.. smile


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Domestic Cat
Дата 30.3.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Чего то я не понял твоей мысли. Передаче чего ест время? Нельзя передать кусок респонса а потом еще один. Он идет целиком.


--------------------

PM   Вверх
Domestic Cat
Дата 30.3.2005, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Цитата
Насколько я понял, они должны полностью принять весь запрос, что бы его обработать и передать дальше тоже полностью. Т.е. они не потоковые, а именно последовательные.

Если более подробно - если посмотреть например на хттп реквест, то серверу в любом случае оно нужно целиком. Скажем, если оно содержит ПОСТ реквест, то нужно прочесть все поля, а иначе не будет смысла вообще что-то делать Точно так же фильтр должен послать весь реквест, иначе клиент получит например кусок хедера и ничего вообще не покажет. Или я не так понял?


--------------------

PM   Вверх
Се ля ви
Дата 30.3.2005, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Domestic Cat
Ну смотри, есть же, например, правило, что заголовки ответа нужно устанавливать в сервлете ДО генерации контента (по крайней мере было в ранних спецификациях), если отключено кэширование вывода. Я это интерпретировал так, что HTTP-ответ начинает приходить клиенту уже в процессе выполнения сервлета, а не после окончания работы метода doPost или doGet - разве не так?

Иначе теряется смысл везде писать response.printLn("ляляля") - можно было бы всё копить в строковый буфер и потом выдавать сразу.

Тогда, получается, что установка фильтра блокирует потоковый вывод, заставляя выводить пользователю данные все сразу? Вот как этого избежать - вот в чём вопрос.

Грубо говоря, как заставить фильтр работать в режиме модели SAX? Типа сервлету идёт запрос, фильтр его пропускает, сервлет выдаёт ответ в виде XML-потока тегов, а мы в фильтре ловим всё это по событиям SAX`а и не дожидаясь конца документа сразу посылаем клиенту - так можно сделать или нет?..


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Domestic Cat
Дата 30.3.2005, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Думаю, что нет, да и смысла особогo не вижу. Фильтр нужен для манипуляций с респонсом/реквестом каk целым, например, чтоб его заархивировать и съекономить тем самым трафик - этo будеt гораздо быстрее любых других вариантов.


--------------------

PM   Вверх
Се ля ви
Дата 30.3.2005, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Цитата(Domestic @ 30.3.2005, 19:02)
смысла особогo не вижу

Domestic Cat, хм, ну ведь SAX не зря придумали! Ну например, видео или звук кому-то приспичело гнать через Java и нам надо его малость обрабатывать по пути - как тогда?.. Если впринципе документа нет, а есть лишь поток, к которому подключаются и отключаются? Или для этого другой API, что-то вместо сервлетов используется?


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
3,14
Дата 31.3.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Кажется раскопал как это сделать, но точно не уверен, так что гогами не пинать, для этого нужно использовать классы: Filter, HttpServletRequestWrapper/HttpServletRepsponseWrapper и модифицировать ServletOutputStream, перегрузкой его методов мы как раз получим фильтрацию на уровне потока:

Код

//класс фильтра
public class MyFilter implements Filter 
{
    private FilterConfig filterConfig;

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

    public void destroy() 
    {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                      throws java.io.IOException, javax.servlet.ServletException 
    {
             
       MyResponseWrapper responseWrapper = new MyResponseWrapper((HttpServletResponse)response);
       chain.doFilter(request, responseWrapper);
    }
    
}

//расширение ServletOutputStream
public class FilterServletOutputStream extends ServletOutputStream
{
  protected OutputStream out;
  
  public FilterServletIutputStream(OutputStream out)
  {
    this.out = new OutputStream(out);
  }
  
  public void write(int b) throws IOException
  {
    //реализация фильтра
  }
  
  public void write(byte [] b) throws IOException
  {
    write(b, 0, b.length);
  }
  
  public void write(byte [] b, int off, int len) throws IOException
  {
   //раелизация фильтра
  }
}

//класс врапера
public class MyResponseWrapper extends HttpResponseWrapper
{
  FilterServletOutputStream out;
  
  public MyResponseWrapper(HttpServletResponse response)
  {
    super(reponse);
    out = new FilterServletOutputStream(response.getOutputStream());
  }
  
  public ServletOutputStream getOutputStream() throws IOException
  {
    return out;
  }
  
  public PrintWriter getWriter()
  {
    return new PrintWriter(out);
  }
}



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Domestic Cat
Дата 2.4.2005, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Разве что для стрима нужно... А так смысла не вижу. Или докажите smile


--------------------

PM   Вверх
3,14
Дата 4.4.2005, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 3
Всего: 24



Domestic Cat - ну, допустим изображения обрабатывать на выходе, к примеру, добавлять на них надпись www.mysite.ru

Это сообщение отредактировал(а) 3,14 - 4.4.2005, 11:13


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0869 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.