今天学习Spring,发现POST拿到的正文参数中文乱码,后来检查了各个与POST正文乱码相关的地方,编码都设定为UTF-8,后来还添加了自己的过滤器,但是还是乱码,没有办法,断点调试,发现我的过滤器拿到的request是经过了好多手才送到我这里的,看看类名,发现是被Spring Security包裹的request,然后就怀疑是不是Spring Security导致的,最后发现,还真是这个问题,后来在网上找到了解决方式,做个记录。
package com.yjp.springmvc.blog.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.csrf.CsrfFilter;
import org.springframework.web.filter.CharacterEncodingFilter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
//添加转码
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
encodingFilter.setForceEncoding(true);
http.addFilterBefore(encodingFilter, CsrfFilter.class);
//配置拦截规则
http
.formLogin()
.loginPage("/login")
.failureUrl("/loginError")
.and()
.logout()
.logoutSuccessUrl("/login")
.and()
.authorizeRequests()
.antMatchers("/").authenticated()
.antMatchers("/**").permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.userDetailsService(userDetailsService);
}
}
在CsrfFilter前配置上Spring的CharacterEncodingFilter即可。