powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Непонятки с фильтром кодировок.
3 сообщений из 3, страница 1 из 1
Непонятки с фильтром кодировок.
    #33695587
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу, чтобы в фильтре, в зависимо от типа запрашиваемой разметки (html||wml) ставилась кодировка (Cp1251||UTF-8) соответственно.

Вот код фильтра + маппинг:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter- class >filters.character_encoding.SetCharacterEncodingFilter</filter- class >
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF- 8 </param-value>
    </init-param>
  </filter>

Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
 package  filters.character_encoding;

 import  java.io.IOException;
 import  javax.servlet.Filter;
 import  javax.servlet.FilterChain;
 import  javax.servlet.FilterConfig;
 import  javax.servlet.ServletException;
 import  javax.servlet.ServletRequest;
 import  javax.servlet.ServletResponse;
 import  javax.servlet.UnavailableException;



 public   class  SetCharacterEncodingFilter  implements  Filter
    {

        
         protected  String encoding =  null ;

       
         protected  FilterConfig filterConfig =  null ;

        
         protected   boolean  ignore = true;

       
         public   void  destroy()
            {

                 this .encoding =  null ;
                 this .filterConfig =  null ;

            }

       
         public   void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  throws  IOException,ServletException
            {

               
                 if  (ignore || (request.getCharacterEncoding() ==  null ))
                    {
                        String encoding = selectEncoding(request);
                         if  (encoding !=  null )
                            request.setCharacterEncoding(encoding);
                    }

               

                chain.doFilter(request, response);

            }

       
         public   void  init(FilterConfig filterConfig)  throws  ServletException
            {

                 this .filterConfig = filterConfig;
                 this .encoding = filterConfig.getInitParameter("encoding");
                String value = filterConfig.getInitParameter("ignore");
                 if  (value ==  null )
                     this .ignore = true;
                 else   if  (value.equalsIgnoreCase("true"))
                     this .ignore = true;
                 else   if  (value.equalsIgnoreCase("yes"))
                     this .ignore = true;
                 else 
                     this .ignore = false;

            }

       
         protected  String selectEncoding(ServletRequest request)
            {
                /*
            	String markupLanguage = request.getParameter("markup_language");
                
                if (markupLanguage == null)
                    {
                        return ("Cp1251");
                    }
                else
                    return ("UTF-8");
                */
            	 return  ("Cp1251");
            }

    }

Самое странное:

Когда пишу так:

Код: plaintext
1.
2.
3.
 protected  String selectEncoding(ServletRequest request)
            {
                          	 return  ("Cp1251");
            }

Все работает нормально.

Когда:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 protected  String selectEncoding(ServletRequest request)
            {
              
            	String markupLanguage = request.getParameter("markup_language");
                
                 if  (markupLanguage ==  null )
                    {
                         return  ("Cp1251");
                    }
                 else 
                     return  ("UTF-8");
          }
В базе вопросики. Несмотря на то что при дебаге отчетливо видно, что попадаем в ветку Cp1251
...
Рейтинг: 0 / 0
Непонятки с фильтром кодировок.
    #33695864
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел причину. Далеко не очевидна, как оказалось. Откуда берется эта "тонкость"???

Нужно принимать POST запрос со страниц в UTF-8 и windows-1251, и принимать request.getParameter("p");

Как узнать с какой страницы они пришли, если нельзя ничего выхватить из request в фильтре?

авторВ применении метода request.setCharacterEncoding() есть одна существенная тонкость — он должен быть применен до первого обращения к запросу за данными (например request.getParameter()). Если Вы используете фильтры, которые обрабатывают запрос до того как он приходит в сервлет, есть ненулевая вероятность того, что в одном из фильтров может произойти чтение какого-нибудь параметра из запроса (например для авторизации) и request.setCharacterEncoding() в сервлете не сработает.
...
Рейтинг: 0 / 0
Непонятки с фильтром кодировок.
    #33696069
коты
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется правильнее определить, поддерживает ли агент нужную кодировку по заголовку accept-encoding (наличию его в т.ч.) и выдать соответствующую.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Непонятки с фильтром кодировок.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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