Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC и русская кодировка / 22 сообщений из 22, страница 1 из 1
19.03.2018, 16:13
    #39616904
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Погодите смеяться, дорогие коллеги, и отправлять в 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
19.03.2018, 16:23
    #39616910
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
mesierТак, допустим, пароль вводим "ааппрр" - 6 символов - получим "ааппÑ�Ñ�".Вы работаете с юникодной строкой (кодировка utf8) как с массивом байт.
Простейший способ так косячить - использовать однобайтовую кодировку. В вашем случае windows-1251.
...
Рейтинг: 0 / 0
19.03.2018, 16:28
    #39616912
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Basil A. Sidorov,

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


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

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

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

Попробуйте запустить jvm с явным указанием -Dfile.encoding
...
Рейтинг: 0 / 0
19.03.2018, 16:47
    #39616935
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Blazkowicz, JVM ?
Или Tomcat ?
...
Рейтинг: 0 / 0
19.03.2018, 17:08
    #39616951
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
mesier, а у вас Tomcat без JVM умудряется работать?
...
Рейтинг: 0 / 0
19.03.2018, 17:35
    #39616983
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Что-то -Dfile.encoding=UTF-8 пока не помогло.. ((
...
Рейтинг: 0 / 0
19.03.2018, 23:14
    #39617110
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
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
20.03.2018, 08:10
    #39617181
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Мы так и не определились откуда имя-то берется. Kerberos намекает на то что из AD. Но если всякие там фильтры влияют, то имя берется из параметров запроса? Тогда, может, Tomcat server.xml подкрутить?
...
Рейтинг: 0 / 0
20.03.2018, 08:47
    #39617203
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Basil A. Sidorov, я пробовал убирать фильтры. Тоже не помогает..
С утра появилась свежая мысль обновить Спринг, подтянуть версию посвежее. Ща попробую. ))
...
Рейтинг: 0 / 0
20.03.2018, 08:55
    #39617211
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
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
20.03.2018, 11:27
    #39617351
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Включайте отладку или в браузере или на котяре и смотрите, какие заголовки отправляются/приходят.
...
Рейтинг: 0 / 0
20.03.2018, 14:16
    #39617545
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Basil A. Sidorov,
ну вот как-то так.
...
Рейтинг: 0 / 0
20.03.2018, 14:24
    #39617554
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Когда-то подобные проблемы были с GET-запросами. Ни URIEncoding в коннекторе ни фильтр не помогли. Плюнул, сделал отправку всего, что может содержать не-Latin1, POST-запросами.
...
Рейтинг: 0 / 0
20.03.2018, 14:28
    #39617560
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Alexander A. Sak,

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

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

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

Код: 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
20.03.2018, 15:12
    #39617607
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Nixicпримерно вот так получается:
Костыль. Некоторые символы пропадают таким образом.
...
Рейтинг: 0 / 0
28.03.2018, 11:33
    #39621869
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC и русская кодировка
Кароч, в web.xml фильтр CharacterEncodingFilter должен стоять первым в цепочке фильтров. Что важно, вместе с секцией filter-mapping.
А у меня первым стоял springSecurityFilterChain.
После перемены мест, заработало..
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC и русская кодировка / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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