解决:客户端请求与servlet程序响应的中文乱码问题
一·问题描述:
1.客户端(浏览器)的请求路径中存在中文路径的时候,导致报错
2.后端服务器中的servlet程序,传送数据回前端浏览器的时候存在中文,导致报错。
二·报错原因:
客户端与服务器端的解析字符编码格式不一致
三·解决方案:
前提:设置项目编码格式为:UTF-8
如下图所示:
方案一:直接在servlet程序中设置字符集格式
public class AsynchronousServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决客户端请求中文乱码
req.setCharacterEncoding("UTF-8");
//统一浏览器的字符集编码格式:utf-8,解决响应中文乱码
resp.setContentType("text/html;charset=UTF-8");
//再添加处理业务逻辑的代码。。。。。。
}
}
方案二:在web.xml文件中注册字符编码过滤器,使用SpringMVC框架自带的字符过滤器;
第一步:在web.xml文件中配置过滤器
<!-- 注册声明过滤器,解决post乱码问题,get请求没有乱码问题-->
<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>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>characterEncodingFilter</filter-name>
<!--拦截所有请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
第二步:更改浏览器的编码格式为:UTF-8
注意:
1.浏览器编码格式的修改方法,不同浏览器的修改方式不一样;具体可以去参考网上的教程,本人这里就不列举了
2.该方案不支持,servlet的异步处理,即多线程。
方案三(推荐):在web.xml文件中注册字符编码过滤器,使用自定义的字符编码过滤器;
第一步:创建一个MyFilter类,且实现Filter接口(javax.servlet.Filter),注意Filter有很多,注意别搞错了
public class MyFilter implements javax.servlet.Filter {
//定义一个变量,接收初始化的值
private static String encoding=null;
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//接收web.xml配置文件中的初始参数
encoding=filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("经过过滤器doFilter()方法。。。。。。。。。。。。");
if (encoding != null) {
// 设置字符编码链锁
//设置从request中取得的值或从数据库中取出的值的编码格式
request.setCharacterEncoding(encoding);
//(1)告诉前端浏览器响应需要的编码格式,
//(2)并且自动修改浏览器显示的编码格式.
response.setContentType("text/html;charset=" + encoding);
}
chain.doFilter(request,response);
}
@Override
public void destroy() {
encoding=null;
}
}
第二步:在web.xml文件中配置自定义过滤器
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.lmf.mvc.filter.MyFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
四·综上所述:
1.三个方案的分析:
方案一:每个servlet程序都需要重写这段代码
方案二:每次都需要手动修改浏览器的编码格式
方案三:每个项目只需配置一次,因此推荐使用
2.三个方案的核心代码分析:
注意:这三行核心代码若使用,必须放在最开头位置
(1)request.setCharacterEncoding(“utf-8”)
作用:设置从request中取得的值或从数据库中取出的值的解析编码格式,只对POST方法有效,对GET方法无效。
(2)response.setContentType(“text/html;charset=utf-8”)
作用一:指定前端浏览器响应需要的编码格式;
作用二:并且自动修改浏览器显示的编码格式.。
(3)response.setCharacterEncoding(“utf-8”)
作用:只指定前端浏览器响应需要的编码格式
(4)这三行代码的详情,请点击下面链接: