Spring MVC 彻底解决中文乱码

springmvc乱码解决

1、UTF-8国际编码,GBK中文编码。GBK包含GB2312,即如果通过GB2312编码后可通过GBK解码,反之可能不成立。

2、web tomcat:默认是ISO8859-1,不支持中文的。

3、中文乱码问题:其实是因为编码和解码的不一致造成的。首先确保html或jsp页面的编码格式是某个编码,比如utf-8,因为客户端对正文内容的编码是根据页面的编码来设定的,所以你只需要在服务器读出参数之前设置解码的字符集,响应回去之前设置编码的字符集,这样就可以搞定了。 

springmvc的中文乱码问题主要有以下几种情形:

    1. 页面传值到后台乱码:

    工程编码(最好一开始建立工程就设置整个工程的编码)

    页面的几种编码属性的设置

    get提交方式乱码的处理

    post提交方式乱码的处理

  2. 后台到数据库乱码:

    数据库连接字符串指定编码格式

    数据库编码属性(也是一开始设置数据库的时候就要设置好,不然要重新建数据库)

一. 页面传值到后台乱码

  1) JSP 文件编码 :

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

   2) html 文件编码 : 

<meta charset="UTF-8">

   3)get提交方式乱码的处理(一般由于tomcat引起的,所以需要设置tomcat的编码):

原因:请求参数带在url地址上、url地址什么时候解析? tomcat收到请求对url进行编解码(ISO8859-1)

解决方案:在tomcat的server.xml配置文件中改Connector标签,加上一个 URIEncoding=”utf-8”

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

   4)post提交方式乱码的处理(在web.xml中设置编码过滤器):

原因:post请求参数是在请求体中, 请求体的解码是在第一次获取参数的时候。

解决方案:filter可以用来解决乱码,

        请求编码 request.setCharacterEncoding("utf-8"), 响应编码 response.setContentType("text/html;charset=utf-8")

SpringMVC自带的一个解决中文乱码的 CharacterEncodingFilter 过滤器,项目的web.xml中配置: 

<!--解决中文乱码的filter一定要放在最前面  -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!-- 配置encoding,告诉我们指定的编码格式 -->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <!-- 解决响应乱码 -->
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

来看看CharacterEncodingFilter的源码 :

public class CharacterEncodingFilter extends OncePerRequestFilter {
	@Nullable
	private String encoding;
	private boolean forceRequestEncoding = false;
	private boolean forceResponseEncoding = false;


//构造器
	public CharacterEncodingFilter() {
	}
	public CharacterEncodingFilter(String encoding) {
		this(encoding, false);
	}

	public CharacterEncodingFilter(String encoding, boolean forceEncoding) {
		this(encoding, forceEncoding, forceEncoding);
	}
	public CharacterEncodingFilter(String encoding, boolean forceRequestEncoding, boolean forceResponseEncoding) {
		Assert.hasLength(encoding, "Encoding must not be empty");
		this.encoding = encoding;
		this.forceRequestEncoding = forceRequestEncoding;
		this.forceResponseEncoding = forceResponseEncoding;
	}

//get,set方法
	public void setEncoding(@Nullable String encoding) {
		this.encoding = encoding;
        }
	@Nullable
	public String getEncoding() {
		return this.encoding;
	}
	public void setForceEncoding(boolean forceEncoding) {
		this.forceRequestEncoding = forceEncoding;
		this.forceResponseEncoding = forceEncoding;
	}
	public void setForceRequestEncoding(boolean forceRequestEncoding) {
		this.forceRequestEncoding = forceRequestEncoding;
	}
	public boolean isForceRequestEncoding() {
		return this.forceRequestEncoding;
	}
	public void setForceResponseEncoding(boolean forceResponseEncoding) {
		this.forceResponseEncoding = forceResponseEncoding;
	}
	public boolean isForceResponseEncoding() {
		return this.forceResponseEncoding;
	}

//doFilterInternal方法
	@Override
	protected void doFilterInternal(
			HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {

		String encoding = getEncoding();
		if (encoding != null) {
			if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
				request.setCharacterEncoding(encoding);
			}
			if (isForceResponseEncoding()) {
				response.setCharacterEncoding(encoding);
			}
		}
		filterChain.doFilter(request, response);
	}

}

 

二、 后台到数据库乱码

    1)数据库连接 字符串指定编码:

jdbc.url=jdbc:mysql://localhost:3306/sshweb?useUnicode=true&characterEncoding=utf8&useSSL=true

    2)数据库新建时的编码属性:

 

猜你喜欢

转载自blog.csdn.net/qq_42402854/article/details/82825941