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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сервлеты. Фильтры. Как сделать фильтр вводимой информации? 
V
    Опции темы
Tirael
Дата 6.4.2006, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: 1
Всего: 7



Делаю простейшее приложение на сервлетах. Суть: Есть HTML страница с одним полем. Вводишь в поле (например) свое имя, страница обнавляется и выводится "Привет" + то, что ты ввел. Решил приделать к программе неколько фильтров.

Собственно три вопроса:

№1:
Хочу вводимую информацию проверять на наличие спец символов. Если таковые имеются. то заменять их на коды. Например, спецсимвол © заменяется на © Написал и задеплоил фильтр. Но не работает.

Код фильтра
Код

public class UserNameFilter implements Filter {

    public void init(FilterConfig config) throws ServletException { }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        String username = request.getParameter("username");
        String out="";
        char ch;
        for(int i=0; i<username.length();i++) {
            ch = username.charAt(i);
            switch(ch) {
                case '«': out = out + "&laquo;"; break;
                case '»': out = out +"&raquo;" ; break;
                case '—': out = out +"&mdash;" ; break;
                case '©': out = out +"&copy;" ; break;
                case '®': out = out +"&reg;" ; break;
                case '™': out = out +"&trade;;" ; break;
                case '/': out = out +"/" ; break;
                case '<': out = out +"&lt;" ; break;
                case '>': out = out +"&gt;" ; break;
                default: out=out+ ch;
            }
        }
        request.removeAttribute("username");
        request.setAttribute("username", out);
       
        chain.doFilter(request, response);
    }

    public void destroy() {   }
}

Как сделать так чтоб работал. Может стоит фильтровать не вводимую информацию, а выводимую? Но тогда ведь очень накладно получается.

№2
Хотел сделать счетчик. Создал класс Counter

Код

public class Counter {
    private static int counter;

    public Counter() {
        counter = 0;
    }

    public static synchronized int getCounter() {
        return counter;
    }

    public static  synchronized int setCounter(int c) {
        counter = c;

        return counter;
    }

    public static synchronized int incCounter() {
        return (++counter);
    }
}


Создал и прописал фильтр

Код

public class UserCounterFilter implements Filter {
    private Counter userCounter;

    public void init(FilterConfig config) throws ServletException {
        userCounter = new Counter();
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        userCounter.incCounter();
        chain.doFilter(request, response);
    }

    public void destroy() {
    }
}



в самой программе ( в сервлете) пишу
Код

out.println("This programm has been used "+ Counter.getCounter() +" times." );


И все вроде бы работает, но криво. А именно: Вводишь в строку адреса расположение сервлета ( http://bla-bla:8080/hello), счетчик показывает 0. Вводишь информацию в поле, кликаешь кнопку, страница обнавляется ( в адресной строке уже http://bla-bla:8080/hello?username=BLA-BLA-BLA ). Выводится 1. Все бы хорошо. Но если опять перейти по адресу http://bla-bla:8080/hello, то опять выведется 0. Вводим в поле данные, жмем кнопку, уже выводиться не 1, а 2. Как сделать по нормальному ?

№ 3
Если ввести в поле русские символы, то потом они выводяться криво ( каракулями), хотя вроде кодировку меняю в фильтре.

CharSetEncodingFilter
Код

public class CharSetEncodingFilter implements Filter {
    public String ENCODING;

    public void init (FilterConfig filterConfig) throws ServletException {
        ENCODING=filterConfig.getServletContext().getInitParameter("ENCODING");
    }
    public void destroy () {
     }
    public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding(ENCODING);
        response.setCharacterEncoding(ENCODING);
        chain.doFilter(request, response);
    }
}



Вот код самих сервлетов :

GreetingServlet
Код

public class GreetingServlet extends HttpServlet {
    private String GREETING;

    public void init(ServletConfig config) throws ServletException {
        GREETING= config.getServletContext().getInitParameter("GREETING");
        super.init(config);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        request.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        String greeting = getServletConfig().getInitParameter("Greeting");
        out.println("<HTML>");
            out.println("<HEAD>");
                out.println("<TITLE>"+ "</TITLE>");
            out.println("</HEAD>");
            out.println("<BODY>");
                out.println("<IMG SRC=\"/duke.waving.gif\" ALT=\"Duke Waving\">");
                out.println("<H2>"+GREETING+  "</H2>");
                out.println("<FORM METHOD=\"get\">");
                    out.println("<INPUT TYPE=\"text\" NAME=\"username\" size=\"25\">");
                    out.println("<INPUT TYPE=\"submit\" value=\"Submit\">");
                    out.println("<INPUT TYPE=\"reset\" value=\"Reset\">");
                out.println("</FORM>");

        String username=request.getParameter("username");
        if (username != null && username.length()>0) {
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/response");
            if (dispatcher!=null) {
                dispatcher.include(request,response);
            }
        }
                out.println("This programm has been used "+ Counter.getCounter() +" times." );         
            out.println("</BODY>");
        out.println("</HTML>");
        out.close();
    }
}


ResponseServlet
Код

public class ResponseServlet extends HttpServlet {
    private String GREETING_NAME;
    public void init(ServletConfig config) throws ServletException{
        GREETING_NAME=config.getServletContext().getInitParameter("GREETING_NAME");
        super.init(config);
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String username = request.getParameter("username");

        if ( username!=null && username.length()>0) {
            out.println("<CENTER>");
            out.println("<TABLE> ");
            out.println("<TR><TD><H2>"+ GREETING_NAME +" "+ username+ "</H2></TD>");
            out.println("<TD><IMG SRC=\"/hi.jpg\" ALT=\"PREVED\"></TD></TR>");
            out.println("</TABLE>");
            out.println("</CENTER>");
        }
    }
}



--------------------
 
PM MAIL   Вверх
tux
Дата 7.4.2006, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Tirael @ 7.4.2006, 04:08 Найти цитируемый пост)
№1:
Хочу вводимую информацию проверять на наличие спец символов. Если таковые имеются. то заменять их на коды. Например, спецсимвол © заменяется на &copy; Написал и задеплоил фильтр. Но не работает.

Обрати внимание, что получаешь ты параметр (request.getParameter()), а потом устанавливаешь атрибут (request.setAttribute()), а в сервлете получаешь опять параметр. Изменение значений параметров в Servlet API не предусмотрено, поэтому придется обходиться какими-то другими вариантами, например, получать в сервлете атрибут вместо параметра, предполагая что фильтр у тебя уже поработал.

Цитата(Tirael @ 7.4.2006, 04:08 Найти цитируемый пост)
Но если опять перейти по адресу http://bla-bla:8080/hello, то опять выведется 0.

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

<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT" />

То есть у тебя в сервлете будет примерно так:
Код

out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>"+ "</TITLE>");
out.println("<meta http-equiv='pragma' content='no-cache' />");
out.println("<meta http-equiv='expires' content='Wed, 26 Feb 1997 08:21:57 GMT' />");
out.println("</HEAD>");


Цитата(Tirael @ 7.4.2006, 04:08 Найти цитируемый пост)
№ 3
Если ввести в поле русские символы, то потом они выводяться криво ( каракулями), хотя вроде кодировку меняю в фильтре.

Если бы фильтр не работал у тебя бы скорее всего (не знаю какой веб-контейнер) выводились не каракули, а знаки вопроса. Попробуй проверить использование кодировок.
Вот здесь:
Код

response.setContentType("text/html");
request.setCharacterEncoding("UTF-8");

у тебя второй раз кодировка запроса устанавливается (первый в фильтре). Попробуй ее просто убрать, а первую строку заменить на такую:
Код

response.setContentType("text/html; charset=UTF-8");

И проверь везде ли у тебя UTF-8. Кодировку для response в фильтре тоже в общем-то устанавливать не нужно.
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 7.4.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



1) Могу еще посоветовать такой способ:

посмотри простейший пример использования jsp. В jsp используются либо коды html - для статической части, либо скриптлеты(коды java) - для динамической части.

Чтоб при запуске сразу выводить эту страничку в методе doGet прописиываешь:
Код

public void doGet(...) throws ...
{
   ...
   req.setAttribute("mess", message); // заранее объявляешь message как глобальную переменную
   request.getRequestDispatcher(URL).forward(request,response)
}


message - то, что вводит пользователь(ниже прояснится)
URL - соответственно где твоя страница jsp находится

На странице jsp:
Код

...
    String mess = (String) request.getAttribute("mess");
    if (mess.lenght() != 0){
     Привет. <%=mess%>
    }
    } else {
     Привет
    }/* проверка, если ты первый раз запустил, то просто привет, если пользователь уже что-то ввел,  то это выведится с помощью <%=mess%> */
...
<form method=post action=URL>//Это наверно понятно, передаются данные в метод doPost
        <pre>
            <input type="text" size=72 name="message"> <br>
            <input type="submit" value="Добавить"> <br> 
        </pre>
</form>


Здесь URL - где находится класс сервлета

А в методе doPost:
Код

    public void doPost(...)
            throws ... {
        req.setCharacterEncoding("Cp1251");
        resp.setContentType("text/html; charset=windows-1251");
        message = req.getParameter("message");//получил, то что ввел  
        // можешь спокойно обрабатывать введенные данные, не загромождая кодами html
        ...
        doGet(req, resp);//и опять возвращаемся на jsp страницу 
    }


2) По поводу кодировки тебе уже отписали, но почитай может что полезное еще почерпнешь
http://jug.in.ntu-kpi.kiev.ua/forum/posts/list/49.page

3) А по поводу количества посещений у самого руки еще не дошли чтоб разобраться, но попробуй как атрибуты сессии

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

Модератор: P.S.S. Как-то надо улучшать культуру письма, так ведь тебя никто не поймет.

Это сообщение отредактировал(а) tux - 7.4.2006, 10:45


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Tirael
Дата 7.4.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: 1
Всего: 7



tux, спасибо

Цитата(tux @ 7.4.2006, 02:17 Найти цитируемый пост)
Обрати внимание, что получаешь ты параметр (request.getParameter()), а потом устанавливаешь атрибут (request.setAttribute()), а в сервлете получаешь опять параметр. Изменение значений параметров в Servlet API не предусмотрено, поэтому придется обходиться какими-то другими вариантами, например, получать в сервлете атрибут вместо параметра, предполагая что фильтр у тебя уже поработал.

Да, действительно, я сначала не разобрался в чем отличие Parameter от Attribute. Потом почитал спецификацю, стало понятно. Сейчас в фильтре приделываю аттрибут request.setAttribute("hitCounter",userCounter); , а в основоном сервлете его считываю String username=(String)request.getAttribute("username");. Все работает.


Цитата(tux @ 7.4.2006, 02:17 Найти цитируемый пост)
Могу предположить, что страница сохраняется в кэше браузера и показывается без запроса к серверу.

Да, действительно, так и было. Вставил meta-данные и все стало хорошо. smile



Цитата(tux @ 7.4.2006, 02:17 Найти цитируемый пост)
Если бы фильтр не работал у тебя бы скорее всего (не знаю какой веб-контейнер) выводились не каракули, а знаки вопроса.  Попробуй проверить использование кодировок.

Да, действительно, до того как появился фильтр кодировки показывались знаки вопроса. Но где еще можно проверить использование кодировки ? Ведь филтр по-идее все уже сделал??


Bulat, конечно JSP это хорошо. Но в данный момент меня интересуют именно сервлеты. Конкретнее - фильтры и листенеры. )))

tux, нажал было [+], а мне сказали что 16 постов это мало. Надо 100 smile

Это сообщение отредактировал(а) Tirael - 7.4.2006, 12:21
--------------------
 
PM MAIL   Вверх
batigoal
Дата 7.4.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Цитата(Tirael @ 7.4.2006, 13:19 Найти цитируемый пост)
нажал было [+], а мне сказали что 16 постов это мало. Надо 100 smile

Поможем...


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Bulat
Дата 7.4.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(Tirael @ 7.4.2006, 12:19)
Bulat, конечно JSP это хорошо. Но в данный момент меня интересуют именно сервлеты. Конкретнее - фильтры и листенеры. )))

Судя по тому что ты хочешь сделать, вообще, удобнее использовать jsp. Ну а если именно фильтры тебя интересуют то лучше, чем уже написали выше, вряд ли что-то посоветую. Кстати при создании сервлетов jsp играет не самую последную роль.


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Tirael
Дата 9.4.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: 1
Всего: 7



И все таки, после всего сказанного не могу разобраться с кодировкой.
ВВожу в поле русские буквы, а на страницу выводятся каракули. Как ни старался. Везде вроде поставленно UTF-8.
Заметил еще один глюк. Не все спец символы отображаются корректно. Так, например, символ > заменяется на &gt; , но символ © почему-то заменяется на Â&copy;. Наверное дело тоже в кодировке. Уже полголовы сломал.

Это сообщение отредактировал(а) Tirael - 9.4.2006, 12:24
--------------------
 
PM MAIL   Вверх
tux
Дата 9.4.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Tirael @ 9.4.2006, 17:23 Найти цитируемый пост)
И все таки, после всего сказанного не могу разобраться с кодировкой.

Может быть тогда запостишь приложение целиком сюда или в личку, попробуем разобраться. И скажи какой веб-контейнер используешь.
PM MAIL Skype GTalk Jabber YIM   Вверх
Tirael
Дата 9.4.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: 1
Всего: 7



Использую jboss-4.0.3SP1.



Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Hello2.zip 79,02 Kb
--------------------
 
PM MAIL   Вверх
tux
Дата 9.4.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Если метод в форме поменять на POST и добавить в ResponseServlet его обработку (метод doPost()), то все работает. Почему не работает GET пока не могу сказать. Будут новости, напишу.
PM MAIL Skype GTalk Jabber YIM   Вверх
Tirael
Дата 10.4.2006, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: 1
Всего: 7



Н-да ....действительно ....пути господни неисповедимы
--------------------
 
PM MAIL   Вверх
tux
Дата 11.4.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Вспомнил наконец в чем проблема, склероз отпустил.

Так вот, методы GET и POST работают по-разному. В методе POST все параметры запроса передаются отдельно от строки запроса URI и вызов request.setCharacterEncoding() влияет как раз на обработку этих отдельных параметров. В методе GET параметры передаются в самой строке запроса, а каким образом настроить декодирование запроса будет зависеть от конкретного сервера.

Для JBoss (если в качестве веб-контейнера Tomcat, что скорее всего) проблема решается таким образом:
  • в каталоге server/default/deploy/jbossweb* найди файлик server.xml
  • в нем у тэга Connector c атрибутом port="8080" добавь вот такой атрибут: URIEncoding="UTF-8"
Все должно работать.
PM MAIL Skype GTalk Jabber YIM   Вверх
Tirael
  Дата 11.4.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: 1
Всего: 7



tux, спасибо за разьеснение. smile smile
Кстати, хотелось бы знать, откуда такого рода информацию можно подчерпнуть. smile

Дабы не плодить темы, задам следующий вопрос, так же про сервлеты.

Как видно выше, мое приложение состоит из двух сервлетов:
  • GreetingServlet - который развернут на /hello
  • ResponseServlet - который развернут на /response
Причем воторй сервлет является чисто вспомогательным. И доступ к нему должен быть только через первый сервлет.

Так вот, как ограничить доступ к ResponseServlet, так чтобы, например, запросы http://bla-bla:8080/response не обрабатывались, либо шла переадресация на http://bla-bla:8080/hello

Это сообщение отредактировал(а) Tirael - 11.4.2006, 22:23
--------------------
 
PM MAIL   Вверх
tux
Дата 12.4.2006, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Tirael @ 11.4.2006, 23:20 Найти цитируемый пост)
Кстати, хотелось бы знать, откуда такого рода информацию можно подчерпнуть. smile

Про фильтры, устанавливающие кодировку запроса, писалось много где и неоднократно, например, здесь - http://www.getinfo.ru/article296.html. А про URIEncoding не помню где читал, настолько давно, что едва вспомнил. smile

Цитата(Tirael @ 11.4.2006, 23:20 Найти цитируемый пост)
Так вот, как ограничить доступ к ResponseServlet, так чтобы, например, запросы http://bla-bla:8080/response не обрабатывались, либо шла переадресация на http://bla-bla:8080/hello

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

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

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


 




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


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

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