Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
4 / 4 / 1
Регистрация: 20.08.2011
Сообщений: 51

servlet filter

01.08.2012, 18:08. Показов 3035. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here
        String targetEncoding = "UTF-8";
        String encoding = request.getCharacterEncoding();
        System.out.println(encoding);
        if (encoding != null && !encoding.equalsIgnoreCase(targetEncoding)) {
            response.setCharacterEncoding(targetEncoding);
        }
        // pass the request along the filter chain
        chain.doFilter(request, response);
    }
Вопрос: я немного не понимаю как какой запрос интерпретировать, т.е. есть сервлет посылает что-то через фильтр, то responce сервлета в фильтре обрабатывается как request?
кусочек кода должен по идее подменять кодировку на UTF-8 в обе стороны.
И еще 1 неурядица:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/b/TestServlet" method="get" accept-charset="utf-8">
        <input type="submit" value="Testing 'SetCharacterEncoding'">
    </form>
</body>
</html>
не могу понять почему когда нажимаю на кнопку, то в фильтре
Java
1
encoding = request.getCharacterEncoding();
encoding равен null.
ЗЫ: сервлеты и фильтры только начал, мб спрашиваю очевидные вещи.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.08.2012, 18:08
Ответы с готовыми решениями:

Ошибка javax.servlet.ServletException: Error instantiating servlet class myclasses.StudentServlet
Здравствуйте еще раз, выскочило исключение показанное ниже В класспатч добюавил библиотечку j2ee.jar но все равно ругается, в web.xml...

Не находит java.servlet.* и java.servlet.http.*
subj, говорит что package java.servlet.* и java.servlet.http.* не существуют. Это действительно так? Тогда где их взять и куда положить,...

Передача html страниц Servlet -> Servlet
суш4ествует сервлет, кoтoрий генерит хтмл, кaк при випoлнении oпределйoннoгo услoвийa передaтъ упрaвление другoму Сервлету? При етoм...

9
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
02.08.2012, 13:28
Начнем со второго вопроса. Далеко не все браузеры указывают кодировку в запросе () . Вы должны принимать во внимание, что она может быть null. Т.е. проверку можно упростить:

Java
1
2
3
if (targetEncoding.equalsIgnoreCase(encoding)){
    // ...
}
По первому вопросу. Фильтр смотрит кодировку запроса. Если она не совпадает с кодировкой UTF-8, то для ответа ставится UTF-8. Мне такая логика представляется странной. Во-первых, дальше по цепочке обработки кто-то может выставить кодировку ответу и наша потеряется. Во-вторых, непонятно, почему не выставляется кодировка ответу, если в запросе указана UTF-8.
0
4 / 4 / 1
Регистрация: 20.08.2011
Сообщений: 51
02.08.2012, 17:06  [ТС]
я уже переосмыслил этот вопрос, и получил вот что:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest wrapRequest = (HttpServletRequest)request;
        HttpServletResponse wrapResponse = (HttpServletResponse)response;
        String targetEncoding = "UTF-8";
        String inEncoding = wrapRequest.getCharacterEncoding();
        String outEncoding = wrapResponse.getCharacterEncoding();
        if (inEncoding == null || !inEncoding.equalsIgnoreCase(targetEncoding)) {
            wrapRequest.setCharacterEncoding(targetEncoding);
        }
        if (outEncoding == null || !outEncoding.equalsIgnoreCase(targetEncoding)) {
            wrapResponse.setCharacterEncoding(targetEncoding);
        }
        chain.doFilter(wrapRequest, wrapResponse);
    }
и по первому вопросу я не совсем разобрался с фильтром, думал что если менять реквест то на выходе из фильтра он станет респонсом....(
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
02.08.2012, 17:16
Опять неверно.

Если кодировка на входе указана - есть некоторая вероятность, что это не просто так. И что именно в этой кодировке и пришли данные. А Вы ее тут раз - и перебиваете своей, причем другой. Ошибка при декодировании практически гарантирована.

Если кодировка на входе НЕ указана - тут уже надо иметь уверенность, что именно в UTF-8 идут данные. И устанавливать UTF-8.

Аналогично если кодировка на выходе указана. Кто-то установил windows-1251, именно в ней написал ответ в response. А тут Вы - раз и изменили на UTF-8. Пользователь будет рад, получив вместо русского текста символы вопроса.

На выходе кодировку не меняют вообще, ее установка - это ответственность генератора контента. Единственное исключение - если Вы точно знаете, что весь контент генерируется в UTF-8, чтобы не заморачиваться с установкой в каждом месте генерации, сделать это в фильтре. Но тогда это делается безусловно.

На входе менять установленную кодировку - рискованно. Не установленную надо устанавливать только имея уверенность, что используется именно она.
1
4 / 4 / 1
Регистрация: 20.08.2011
Сообщений: 51
02.08.2012, 17:35  [ТС]
здесь не в самой кодировке дело (прост задание такое было), а в понимании механизма работы фильтров) а насчет кодировки и ссылочки на сайт спс)
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
02.08.2012, 18:25
А, ну так бы сразу и сказали...

Фильтры устроены следующим образом. Они выполняются в порядке, определенном в web.xml. Каждый из фильтров в какой-то момент может передать управление следующему элементу цепочки (FilterChain.doFilter). Если фильтр последний - управление передастся сервлету. Соответственно, после того, как сервлет отработал, он возвращает управление, оно попадает в последний фильтр (выход из doFilter). После этого фильтр может сделать еще что-то. Когда он заканчивает работу - управление передается предыдущему. Т.е. сначала фильтры набиваются в стек, на самом верху сервлет, потом стек разматывается обратно.

Естественно, любой фильтр может НЕ передать управление дальше. Может сделать forward, include, redirect. Это полезно, например, для контроля аутентификации. Если в сессии есть признак - запрос пропускается, нет - делается redirect на url аутентификации.

Вот, где-то так.
0
4 / 4 / 1
Регистрация: 20.08.2011
Сообщений: 51
02.08.2012, 18:49  [ТС]
спс, еще вопросик будет по схожей тематике. Мб подскажете по листенерам литературку без воды? чтото ничего толкового не нагуглил
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
02.08.2012, 19:30
По каким именно Listener-ам? Listener - это архитектурный шаблон. Применяется очень много где.
0
4 / 4 / 1
Регистрация: 20.08.2011
Сообщений: 51
03.08.2012, 09:48  [ТС]
я про сервлетные
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
03.08.2012, 13:15
Цитата Сообщение от 4e87 Посмотреть сообщение
я про сервлетные
http://docs.oracle.com/javaee/... tener.html
http://docs.oracle.com/javaee/... tener.html
http://docs.oracle.com/javaee/... tener.html
http://docs.oracle.com/javaee/... tener.html

Вам какой?

В общем, Вам сюда: http://docs.oracle.com/javaee/... bnafd.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.08.2012, 13:15
Помогаю со студенческими работами здесь

Не работает import javax.servlet.*, javax.servlet.http.* в J2EE
Скачал сайта сан J2EE SDK самую последню... j2eesdk-1_4_02_2005q2-windows-ml.exe(133 Mb) так вот не работает import javax.servlet.*,...

Servlet
Добрый день. Вопрос такой: как прописать класс Java (пусть он называется DoAction), чтобы он определял полученные с jsp данные (какая...

Servlet
Добрый день! Помогите разобраться! Вот начал читать о сервлетах и набрал пример с книги: /*import java.io.IOException; import...

Servlet jsp
Скопировал у друга код, но появились ошибки как-то не могу исправить в чем тут ошибка может неправильно импортировал? Вот код...

Servlet 3.0 и GlassFish
Хочу задеплоить на glassfish (брал последнюю версию с оф.сайта) restful вебсервис используя особенности servlet 3.0 о которых всюду так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru