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>
<!--是否强制设置request的编码为encoding,默认false,不建议更改-->
<param-name>forceRequestEncoding</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<!--是否强制设置response的编码为encoding,建议设置为true,下面有关于这个参数的解释-->
<param-name>forceResponseEncoding</param-name>
<param-value>false</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)数据库新建时的编码属性:
ends~