使用Spring mvc 4 用 javaConfig 进行配置
在用 Post 提交数据到后端 Controller 时候,中文出现乱码,原因是使用了“iso-8859-1”编码(通过转码测试出来)
问题是我设置了网上说的 Spring 的解决中文乱码的 Filter 也没用
public class XKingWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{ // 设置映射路径 protected String[] getServletMappings() { // TODO Auto-generated method stub return new String[] {"/"}; } // 指定配置类:RootConfig protected Class<?>[] getRootConfigClasses() { return new Class[] {RootConfig.class, SecurityConfig.class, MailConfig.class}; } // 指定配置类:WebConfig protected Class<?>[] getServletConfigClasses() { return new Class[] {WebConfig.class}; } // 设置编码 @Override protected Filter[] getServletFilters() { return new Filter[] {new CharacterEncodingFilter("UTF-8", true)}; } }
看了 Servlet 3.0 规范 是因为这个Filter 太后执行了么?
当前很多浏览器并不发送带Content-Type头部的字符编码标识符,它会把字符编码的决定留在读取HTTP请求的时候。如果客户端没有指明编码,容器用来创建请求读和解析POST数据的默认编码必须是"ISO-8859-1"。然而,为了提示开发者客户端没有成功发送一个字符编码,容器中getCharacterEncoding方法会返回null。 如果客户端没有设置字符编码,并且请求数据使用了不同编码而不是上述的默认编码,程序将会出现中断。为了纠正这种状态,一个新的方法setCharacterEncoding(String enc) 被添加到ServletRequest接口。开发者调用这个方法能重写容器提供的字符编码。这个方法必须在解析request中任何post数据或者读任何输入之前调用。一旦数据已经被读取,调用这个方法不会影响它的编码。
请问要怎么设置???
已解决
如下设置,搞了一上午
public class XKingWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{ // 设置映射路径 protected String[] getServletMappings() { // TODO Auto-generated method stub return new String[] {"/"}; } // 指定配置类:RootConfig protected Class<?>[] getRootConfigClasses() { return new Class[] {RootConfig.class, SecurityConfig.class, MailConfig.class}; } // 指定配置类:WebConfig protected Class<?>[] getServletConfigClasses() { return new Class[] {WebConfig.class}; } @Override public void onStartup(ServletContext servletContext) throws ServletException { // TODO Auto-generated method stub super.onStartup(servletContext); servletContext.addFilter("name", new CharacterEncodingFilter("UTF-8", true)) .addMappingForUrlPatterns(null, false, "/*"); } }
原来使用 Spring Security 时才有这个问题。
并且这设置时好时坏
最终的解决方案
public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer{ @Override protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter()); characterEncodingFilter.setInitParameter("encoding", "UTF-8"); characterEncodingFilter.setInitParameter("forceEncoding", "true"); characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*"); } }
已解决
如下设置,搞了一上午
public class XKingWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{ // 设置映射路径 protected String[] getServletMappings() { // TODO Auto-generated method stub return new String[] {"/"}; } // 指定配置类:RootConfig protected Class<?>[] getRootConfigClasses() { return new Class[] {RootConfig.class, SecurityConfig.class, MailConfig.class}; } // 指定配置类:WebConfig protected Class<?>[] getServletConfigClasses() { return new Class[] {WebConfig.class}; } @Override public void onStartup(ServletContext servletContext) throws ServletException { // TODO Auto-generated method stub super.onStartup(servletContext); servletContext.addFilter("name", new CharacterEncodingFilter("UTF-8", true)) .addMappingForUrlPatterns(null, false, "/*"); } }
谢谢!非常感谢!
######谢谢,太感谢了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。