Kodowanie znaków UTF-8 JSP Tomcat Spring 4

0

Cześć,

Jest wiele tematów na ten temat. Przejrzałem wszystkie, wypróbowałem różne konfiguracje i niestety nie udało się mi się uzyskać polskich znaków. Problem występuje przy przesłaniu formularza do bazy. Na stronach statyczny tekst się wyświetla prawidłowo. Niżej wrzucam konfiguracje.
Używam Springa, MySQL i Tomcata.

AppConfig.java

 
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "pl.travel.tourist")
public class AppConfig extends WebMvcConfigurerAdapter {
    
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }


    /**
     * Configure ResourceHandlers to serve static resources like CSS/ Javascript etc...
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("messages");
        return messageSource;
    }

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(idToRegionConverter);
        registry.addConverter(idToKategoriaConverter);
        registry.addConverter(roleToUserProfileConverter);
        registry.addConverter(idToWydarzenieConverter);
        registry.addConverter(idToUserConverter);
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer matcher) {
        matcher.setUseRegisteredSuffixPatternMatch(true);
    }

    @Bean
    public MultipartResolver multipartResolver() throws IOException {
        return new StandardServletMultipartResolver();
    }

}

AppInitializer.class

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {

        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { AppConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setMultipartConfig(new MultipartConfigElement("/home/tom/uploads/", 2097152, 4194304, 0));
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);

        FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encoding-filter", new CharacterEncodingFilter());
        encodingFilter.setInitParameter("encoding", "UTF-8");
        encodingFilter.setInitParameter("forceEncoding", "true");
        encodingFilter.addMappingForUrlPatterns(null, true, "/*");
    }

}

SecurityConfiguration.java

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Import({SecurityWebApplicationInitializer.class})
public class SecurityConfiguration extends WebSecurityConfigurerAdapter  {

    @Autowired
    @Qualifier("customUserDetailsService")
    UserDetailsService userDetailsService;

    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
        auth.authenticationProvider(authenticationProvider());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }


    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
        authenticationProvider.setUserDetailsService(userDetailsService);
        authenticationProvider.setPasswordEncoder(passwordEncoder());
        return authenticationProvider;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/admin/**").access("hasRole('ADMIN')")
                .and().formLogin().loginPage("/login")
                .usernameParameter("userLogin").passwordParameter("password")
                .and().csrf().disable();

    }
}

SecurityWebApplicationInitializer.java

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        super.beforeSpringSecurityFilterChain(servletContext);
        FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
        characterEncodingFilter.setInitParameter("encoding", "UTF-8");
        characterEncodingFilter.setInitParameter("forceEncoding", "true");
        characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
    }

}

W pliku configuracyjnym tomcata server.xml ustawiłem tak:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />

Na widokach jsp na górze mam ustawione:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

W formularzach dodaje parametr:
accept-charset="UTF-8"

Proszę o pomoc, jakiekolwiek wskazówki na pewno się przydadzą. Chciałbym się obejść bez konfiguracji w pliku web.xml, jeśli się da :)

0

A spróbuj dodać w swoim ViewResolver

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

W security configu dodaj

CharacterEncodingFilter filter = new CharacterEncodingFilter();
		filter.setEncoding("UTF-8");
		filter.setForceEncoding(true);
		http.addFilterBefore(filter, CsrfFilter.class);
1

Może pokaż dowolny view z formularzem. Używasz JSP, a czy w nagłówku określasz format response?

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
	response.setCharacterEncoding("UTF-8");
	request.setCharacterEncoding("UTF-8");
%>
1

Działa!! :) Dzięki wielkie @Lectre ! Rozwiązaniem było dodanie do widoku JSP tego kodu.

<%
    response.setCharacterEncoding("UTF-8");
    request.setCharacterEncoding("UTF-8");
%>
 

Oprócz tego trzeba upewnić się, że w bazie danych mamy ustawione kodowanie UTF-8 oraz odpowiednio łączymy się z nią przez JDBC.
jdbc:mysql://IP_BAZY_DANYCH/NAZWA_TABELI?useUnicode=true&amp;characterEncoding=utf8

Jak ustawić kodowanie w MySQL na utf-8?
W pliku (dla linuxa) /etc/mysql/my.conf dodajemy pod sekcją [mysqld] taki kod:

character-set-server=utf8
default-character-set=utf8
default-collation=utf8_general_ci
init-connect='SET NAMES utf8'
character-set-client=utf8 

Aktualizujemy nasze tabele za pomocą:
ALTER TABLE nazwa_tabeli CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Dzięki zastosowaniu tych wskazówek i dodaniu filtrów w konfiguracji Spring Security, które już miałem dodane wszystko powinno śmigać :)

0

Podpinam się pod temat.

Na backendzie mam endpoint, który zwraca plik w takiej formie '%C5%9B%C5%9B%C5%9B' . Czy to poprawne czy w requescie powinien być widoczny normalny string 'śśś' ?

Chrome a nawet IE radzą sobie poprawnie. Tylko firefox nie ogarnia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1