powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Использование фильтров из Servlet API для шифрования HTTP-запроса
3 сообщений из 3, страница 1 из 1
Использование фильтров из Servlet API для шифрования HTTP-запроса
    #34854028
Javakka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Желаю здравствовать!

Помогите, пожалуйста, разобраться со следующей проблемой.

Тело HTTP-запроса (POST) поступает на сервер в зашифрованном виде. С помощью фильтра запрос перехватывается и расшифровывается, затем по цепочке передаётся сервлету (Tapestry ApplicationServlet).
Для этой цели объект HttpServletRequest обёртывается с помощью подкласса HttpServletRequestWrapper, где содержимое входного потока (getInputStream()) считывается и переводится в массив байт (ByteArrayInputStream). Дальше производится расшифровка (собственно, эта часть пока отсутствует, тестирую в прозрачном режиме), и класс-обёртка в ответ на вызовы getInputStream и getReader возвращает уже расшифрованный запрос, соответственно, в виде потока или BufferedReader'а.
Проблема в том, что сервлет данные (т.е. тело POST-запроса) не получает.
В ходе длительных шаманских плясок с бубном выяснилось, что если сразу после получения объекта HttpServletRequest в фильтре вызвать у него метод getParameterNames() (см. листинг класса CryptFilter), то всё работает.
Что это? Глюк? Или я чего-то не понимаю? В принципе, всё работает, но хотелось бы решить проблему осознанно :о)

Класс CryptFilter:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
 public   class  CryptFilter  implements  Filter {

     public   void  init(FilterConfig filterConfig)  throws  ServletException {
    }

     public   void  doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
         throws  IOException, ServletException {

        // получаем объекты запроса и ответа
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // вот она, таинственная строчка. Без неё следующий по цепочке сервлет не получает данные post-запроса
        request.getParameterNames();

        // формируем обёртки
        ResponseWrapper rs =  new  ResponseWrapper(response);
        RequestWrapper rq =  new  RequestWrapper(request);

        // передаём обёртки далее по цепочке фильтров
        filterChain.doFilter(rq, rs);

        // формируем зашифрованный выходной поток
        PrintWriter pw = response.getWriter();
        pw.write(rs.getEncoded());

    }

     public   void  destroy() {
    }

}


Класс-обёртка запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
 public   class  RequestWrapper  extends  HttpServletRequestWrapper  {

     private   static   class  ByteArrayServletInputStream  extends  ServletInputStream {

        ByteArrayInputStream baos;

         public  ByteArrayServletInputStream(InputStream is, IGenericDecoder decoder)  throws  IOException {
            ByteArrayOutputStream tmpBaos =  new  ByteArrayOutputStream();
             while  (true) {
                 int  i = is.read();
                 if  (i == - 1 )
                     break ;
                tmpBaos.write(i);
            }
            baos =  new  ByteArrayInputStream(decoder.decode(tmpBaos.toByteArray()));
        }

         public   int  read()  throws  IOException {
             return  baos.read();
        }
    }

     private  BufferedReader br;

     private  ByteArrayServletInputStream basis;

     public  RequestWrapper(HttpServletRequest httpServletRequest)  throws  IOException{
         super (httpServletRequest);
        basis =  new  ByteArrayServletInputStream(httpServletRequest.getInputStream(),  new  TransparentDecoder());
        br =  new  BufferedReader( new  InputStreamReader(basis));
    }

     public  ServletInputStream getInputStream() {
         return  basis;
    }

     public  BufferedReader getReader() {
         return  br;
    }

}
...
Рейтинг: 0 / 0
Использование фильтров из Servlet API для шифрования HTTP-запроса
    #34854594
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю здесь возникает проблема типа: Вы перехватываете поток ввода для обработки и он не анализируется стандартными средствами (т. е. из него не вычленяются данные запроса и не складываются в массив полученных данных). Это нормальная ситуация (см. использование метода getInputStream() интерфейса ServletRequest), т. е. либо Вы перехватываете поток ввода и сами его анализируете, либо поток ввода получает класс реализующий обработку запроса в контейнере сервлетов, который извлекает нужные данные и размещает их в соответствующих коллекциях. Вызвав метод getParameterNames() Вы обратились к стандартному обработчику потока ввода и он распарсил данные поместив их в соответствующую коллекцию.
...
Рейтинг: 0 / 0
Использование фильтров из Servlet API для шифрования HTTP-запроса
    #34855196
Javakka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо, разобрался :о)
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Использование фильтров из Servlet API для шифрования HTTP-запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]