开发者社区> 问答> 正文

Spring mvc 4 javaConfig 配置 post 乱码问题:报错

使用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数据或者读任何输入之前调用。一旦数据已经被读取,调用这个方法不会影响它的编码。

请问要怎么设置???

展开
收起
kun坤 2020-06-07 12:51:32 613 0
1 条回答
写回答
取消 提交回答
  • 引用来自“西瓜树上结葡萄”的评论

    已解决

    如下设置,搞了一上午 

    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, "/*");
    	}
    }



    ######forceEncoding######

    谢谢!非常感谢!

    ######

    谢谢,太感谢了。

    2020-06-07 12:51:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多