Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Непонятки с фильтром кодировок. / 3 сообщений из 3, страница 1 из 1
27.04.2006, 18:07
    #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
27.04.2006, 20:41
    #33695864
Alexey Turn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с фильтром кодировок.
Нашел причину. Далеко не очевидна, как оказалось. Откуда берется эта "тонкость"???

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

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

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


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