由于手动创建了bean 导致POST请求中文乱码
原因: 自定义的bean的filter的排序较低(filter的排序数组越小,执行顺序越靠前),所以在已经封装好到请求参数之后
在执行 characterEncodingFilter这个过滤器,相当于没有用
解决方法 1.
不用自定义,使用Spring自动管理的即可
解决方法 2.
使用其子类 因为子类里面封装了 order(filter的执行顺序的排除) ,源码就能发现
Ordered.HIGHEST_PRECEDENCE=-2147483648 所以这个filter会第一个执行
@Bean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
解决方法 3.
@Bean
public FilterRegistrationBean ordered() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
// 自定义的filer的bean
CharacterEncodingFilter myFilter = new CharacterEncodingFilter();
registrationBean.setFilter(myFilter);
ArrayList<String> urls = new ArrayList<>();
// 配置过滤规则
urls.add("/*");
registrationBean.setUrlPatterns(urls);
// 设置执行顺序,数字越小,越是优先执行
registrationBean.setOrder(3);
return registrationBean;
}
关于如何排查filter的执行顺序
可以参考这个: https://developer.aliyun.com/article/769590?spm=a2c6h.13262185.0.0.41295daf3UldKA
如果debug 不展示顺序,可以参考启动日志,里面包含所有的filter 只要找到源码,debug调试 就知道 filter 的执行顺序啦