powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC и русская кодировка
22 сообщений из 22, страница 1 из 1
Spring MVC и русская кодировка
    #39616904
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погодите смеяться, дорогие коллеги, и отправлять в FAQ! )))
Имеем веб-приложение Spring с аутентификацией через Spring Security.
В коде нужно было реализовать дополнительные действия с авторизуемым пользователем, для чего был создан класс.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Component("kerberosAuthenticationProvider")
public class KerberosAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {

....
    
    @Override
    protected void additionalAuthenticationChecks(UserDetails user, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
        String login = authentication.getName();
        String password = authentication.getCredentials().toString();
....
    }



Так вот, если логин или пароль русскими символами, то строка создается некорректная - по два Character-a на символ.
Так, допустим, пароль вводим "ааппрр" - 6 символов - получим "ааппÑ�Ñ�".
Соответственно, getBytes() из такого пароля возвращает массив длиной 24 байта и, конечно же, неправильно хэшируется.
В чём проблема? Кто портит кодировку?
Устал уже копаться, помогите пожалуйста разобраться.

Фильтры для корректной передачи юникода добавил. Tomcat-у настройки прописал. Пепельницу вытряхивал, по колёсам пинал...



web.xml

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    <filter>
        <filter-name>encoding-filter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding-filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>




security.xml

Код: xml
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.
<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
	http://www.springframework.org/schema/security
	http://www.springframework.org/schema/security/spring-security-4.2.xsd">

    <global-method-security pre-post-annotations="enabled"/>
    
    <beans:bean name="customAccessDeniedHandler"
                class="ru.npt.cim.browser.controller.CustomAccessDeniedHandler" />
    
    <beans:bean id="ajaxRequestMatcher"
                class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
        <beans:constructor-arg value="/rest/**"/>
    </beans:bean>
    
    <beans:bean id="ajaxAuthenticationEntryPoint"
                class="ru.npt.cim.browser.controller.Http403ForbiddenEntryPoint"
                autowire="constructor"/>
    
    <beans:bean id="loginUrlAuthenticationEntryPoint"
                class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
        <beans:constructor-arg value="/login" />
    </beans:bean>
    
    <beans:bean id="authenticationEntryPoint"
                class="org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint">
        <beans:constructor-arg>
            <beans:map>
                <beans:entry key-ref="ajaxRequestMatcher" value-ref="ajaxAuthenticationEntryPoint" />
            </beans:map>
        </beans:constructor-arg>
        <beans:property name="defaultEntryPoint" ref="loginUrlAuthenticationEntryPoint" />
    </beans:bean>
    
    <http auto-config="true" entry-point-ref="authenticationEntryPoint">
        <access-denied-handler ref="customAccessDeniedHandler"/>
        <intercept-url pattern="/login" access="permitAll" />
        <intercept-url pattern="/favicon.ico" access="permitAll" />
        <intercept-url pattern="/resources/**" access="permitAll" />
        <intercept-url pattern="/rest/login" access="permitAll" />
        <intercept-url pattern="/**" access="isAuthenticated()" />
        <form-login 
            login-page="/login" 
            default-target-url="/" 
            authentication-failure-url="/login?error" 
            username-parameter="username"
            password-parameter="password" />
        <logout success-handler-ref="customLogoutSuccessHandler" />
        <csrf disabled="true"/>
        <headers>
            <frame-options disabled="true"></frame-options>
        </headers>
    </http>

    <authentication-manager alias="authenticationManager">
        <authentication-provider ref="kerberosAuthenticationProvider">
        </authentication-provider>
    </authentication-manager> 
    
    <beans:bean id="kerberosAuthenticationProvider" class="ru.npt.cim.browser.services.KerberosAuthenticationProvider" />
    <beans:bean id="customLogoutSuccessHandler" class="ru.npt.cim.browser.services.CustomLogoutSuccessHandler" />

</beans:beans>



...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39616910
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesierТак, допустим, пароль вводим "ааппрр" - 6 символов - получим "ааппÑ�Ñ�".Вы работаете с юникодной строкой (кодировка utf8) как с массивом байт.
Простейший способ так косячить - использовать однобайтовую кодировку. В вашем случае windows-1251.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39616912
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Код: java
1.
authentication.getCredentials()


возвращает Object.
Соответственно, toString() возвращает хрень..
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39616917
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier,

Для метода String.getBytes() нужно указывать кодировку. Его можно использовать без явного указания кодировки только в том случае, если ваш код может работать в разных средах и важно иметь байты именно в дефолтной кодировке.

И, да, Василий прав. У вас имя пользователя было в UTF-8, но кто-то на каком-то этапе решил что это cp1251 и сформировал не верную строку. Нужно исследовать происхождение строки "ааппÑ�Ñ�" чтобы исправить её формирование.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39616921
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier,

Попробуйте запустить jvm с явным указанием -Dfile.encoding
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39616935
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, JVM ?
Или Tomcat ?
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39616951
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier, а у вас Tomcat без JVM умудряется работать?
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39616983
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то -Dfile.encoding=UTF-8 пока не помогло.. ((
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617110
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesierФильтры для корректной передачи юникода добавил.Проблема, возможно - в фильтре.

Согласно документации Spring 4.3.5 : This filter can either apply its encoding if the request does not already specify an encoding, or enforce this filter's encoding in any case ("forceEncoding"="true").

Что "применить, если не указано", что "всегда применить" - косяк для целого ряда сценариев. В общем, я бы фильтр убрал.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617181
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы так и не определились откуда имя-то берется. Kerberos намекает на то что из AD. Но если всякие там фильтры влияют, то имя берется из параметров запроса? Тогда, может, Tomcat server.xml подкрутить?
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617203
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, я пробовал убирать фильтры. Тоже не помогает..
С утра появилась свежая мысль обновить Спринг, подтянуть версию посвежее. Ща попробую. ))
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617211
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, да, это всё ещё до аутентификации происходит. Так что из формы.
Собственно сценарий аутентификации таков, что если юзверь ставит галочку на форме "авторизация в домене" и вводил логин вида "ADNAME\username", то проверяем через керберос в домене. Если нет, то в БД.

В server.xml
Код: xml
1.
2.
3.
4.
5.
<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="UTF-8" />
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617351
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Включайте отладку или в браузере или на котяре и смотрите, какие заголовки отправляются/приходят.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617545
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
ну вот как-то так.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617554
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда-то подобные проблемы были с GET-запросами. Ни URIEncoding в коннекторе ни фильтр не помогли. Плюнул, сделал отправку всего, что может содержать не-Latin1, POST-запросами.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617560
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. Sak,

так это и есть post-запрос.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617591
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesierну вот как-то так... и похоже, что тело запроса (данные формы) декодируется, а потом эти байты читаются как windows-1251.
И windows-1251 и utf-8 совпадают в диапазоне US-ASCII, а вот дальше - начинаются различия.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617598
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier,

Пароль смахивает на UTF-8 кодировку.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617602
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И говорю - "проценты" декодировали в байты и, почему-то, обработали эти байты, как windows-1251, хотя там чистый utf-8.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617603
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сначала определитесь что за кодировка там у вас.
к примеру на гласфише у нас попа вот такая вот, приходится конвертить в контроллере сразу.
если это сунуть на томкат, то работать не будет.
раньше по контексту менялось, сейчас забил и локально тоже глассфиш юзаю.

примерно вот так получается:

Код: java
1.
2.
3.
4.
5.
                try {
                    requestStr = new String(requestStr.getBytes("iso-8859-1"), "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    logger.info("Проблема с кодировкой(UnsupportedEncodingException):" + e);
                }
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39617607
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixicпримерно вот так получается:
Костыль. Некоторые символы пропадают таким образом.
...
Рейтинг: 0 / 0
Spring MVC и русская кодировка
    #39621869
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кароч, в web.xml фильтр CharacterEncodingFilter должен стоять первым в цепочке фильтров. Что важно, вместе с секцией filter-mapping.
А у меня первым стоял springSecurityFilterChain.
После перемены мест, заработало..
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC и русская кодировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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