编写项目中突然用到了中文,然后发生了一大堆的乱码,于是在百度上奋斗良久,终于解决了问题。
项目在java8环境下搭建,使用spring4.3.6
1)前端页面部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录--统一后台管理系统</title>
<link rel="stylesheet" href="../font/iconfont/iconfont.css">
<link rel="stylesheet" href="../css/basic.css">
<link rel="stylesheet" href="../css/login.css">
</head>
<body>
<div class="login-container">
<div class="login-main">
<meta>标签设置页面的编码方式,html5之后可以省略写成<meta charset="UTF-8">,是<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />的简略缩写。
2)服务器端
网上经常看到的是
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<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>
然而使用之后发现并没有生效,查看org.springframework.web.filter.CharacterEncodingFilter包后发现了大问题。
public class CharacterEncodingFilter extends OncePerRequestFilter {
private String encoding;
private boolean forceRequestEncoding = false;
private boolean forceResponseEncoding = false;
/**
* Create a default {@code CharacterEncodingFilter},
* with the encoding to be set via {@link #setEncoding}.
* @see #setEncoding
*/
public CharacterEncodingFilter() {
}
/**
* Create a {@code CharacterEncodingFilter} for the given encoding.
* @param encoding the encoding to apply
* @since 4.2.3
* @see #setEncoding
*/
public CharacterEncodingFilter(String encoding) {
this(encoding, false);
}
forceEncoding是在request请求已有编码方式时,强行替换编码方式的条件,默认为false,然而这里被拆分成forceRequestEncoding和forceResponseEncoding两个部分,所以web.xml需要进行调整,调整之后为
<!-- 字符过滤 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
修改完毕后继续测试,依旧乱码!!!
百度之后发现,编码器如果没有正确设置,哪怕用了过滤器也会乱码,继续修改
设置完毕在测试,依旧乱码!!!!!
继续百度,终于发现,request.setCharacterEncoding()方法只针对post方法有效,对于get方法emmm,修改之后终于没有讨厌的乱码了。
至此问题解决!
ps:get方法中文乱码,如果有什么好的解决办法希望能教我一下,感谢!