1.前端请求数据中转流程
请求
HTML---------------->Tomcat---------------->Servlet
UTF-8 ISO-8859-1 UTF-8
响应
HTML<----------------Tomcat<----------------Servlet
UTF-8 ISO-8859-1 UTF-8
2.请求导致乱码原因
Get请求
请求乱码是由于HTML设置了浏览器在传递参数时,采用的是UTF-8编码格式,但是在Tomcat中解码采用的是ISO-8859-1解码方式,因此会导致乱码。
Post请求
因为post请求是以二进制流的形式发送到服务器,服务器收到后默认的是通过ISO-8859-1进行编码,post请求
解决乱码,只需要在获取请求参数之前调用设置字符集方法即可。
3.解决请求乱码方式
get请求请求乱码解决方式
tomacat 对 GET 和 POST 请求处理方式是不同的,GET 请求的编码问题,要改 tomcat 的 server.xml
配置文件,如下:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>
改为:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true"/>
如果遇到 ajax 请求仍然乱码,请把:
useBodyEncodingForURI="true"改为 URIEncoding="UTF-8"
post请求解决乱码解决方式
<!--解决post请求乱码问题-->
<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>
2.响应乱码解决办法
编写一个过滤器,指定tomcat以何种编码方式编码,告诉浏览器以何种解码方式解码
public class CharacterFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletResponse.setContentType ( "text/html;charset=utf-8" ); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }