【问题标题】:I cannot get the right UTF-8 encoding in Spring MVC我无法在 Spring MVC 中获得正确的 UTF-8 编码
【发布时间】:2015-07-10 12:11:22
【问题描述】:

我对 UTF-8 字符有疑问(例如 ěčžýáí)。我在 Stack Overflow 上找到了一些解决方案,但它对我不起作用。这是我的Conf课。我没有使用 web.xml,一切都是通过注释。

@Configuration
@EnableWebMvc
@Import({ SecurityConfig.class })
@ComponentScan(basePackages = "cz.prosvaly")
public class AppConfig {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");

        return viewResolver;
    }

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

    @Bean(name="multipartResolver")
    public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(10000000);
        return multipartResolver;
    }



}

这是我的编码过滤器:

public class AppInitializer implements WebApplicationInitializer {

    public void onStartup(ServletContext container) throws ServletException {

        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();


        ctx.register(AppConfig.class);
        ctx.setServletContext(container);
        container.addListener(new ContextLoaderListener(ctx));

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


        ServletRegistration.Dynamic servlet = container.addServlet(
                "dispatcher", new DispatcherServlet(ctx));

        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");

    }

}

调度程序配置:

@Configuration
public class DispatcherConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
//        registry.addResourceHandler("/css/**").addResourceLocations("/resources/css/");
//        registry.addResourceHandler("/html/**").addResourceLocations("/html/");
//        registry.addResourceHandler("/images/**").addResourceLocations("/images/");   
        }
}

春季安全

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth.jdbcAuthentication().dataSource(dataSource).
      usersByUsernameQuery("select username,password, enabled from admin where username=?").
      authoritiesByUsernameQuery("select username, role from user_roles where username =?  ")
      .passwordEncoder(new Md5PasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
       .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
       .and().formLogin()
       .loginPage("/login").defaultSuccessUrl("/admin/goods").failureUrl("/login?error")
            .usernameParameter("username").passwordParameter("password")        
       .and().logout().logoutUrl("/logout").logoutSuccessUrl("/login?logout")
       .and().csrf(); 
    }

}

public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
   //do nothing
}

在我在服务器上发送的表单中,我有这个 taglib:

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

我尝试在 Tomcat 中更新这一行:

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

但是当我提交表单时,我在日志中看到了这个

....type for žÄáížíé

【问题讨论】:

  • 您使用哪种 HTTP 方法提交?发布还是获取? URIEncoding="UTF-8" 用于获取,而 CharacterEncodingFilter 用于发布。
  • 在 SO 上以这种方式标记解决方案不是惯例。发布解决方案作为答案。

标签: spring spring-mvc spring-security tomcat7


【解决方案1】:

(代表 OP 发布:)

我必须删除 SpringSecurityInitializer 并通过 AppInitializer 中的以下代码创建过滤器:

fr = container.addFilter("springSecurityFilterChain",
                new DelegatingFilterProxy());
        fr.addMappingForUrlPatterns(null, true, "/*");

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 2011-08-21
    • 2016-01-11
    • 2019-03-05
    • 2017-04-27
    • 2011-08-04
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多