感谢elfin1314对我上一篇关于乱码问题的建议——使用过滤器。那本文就会对乱码问题做一个阶段性的总结,提供给大家一个简单并且可以方便处理乱码的方案。
过滤器是什么?我个人的理解简单来说就是:拦截客户端的请求,进行定制化的处理后继续执行未完成的请求。
在这里做一下简单说明,为什么过滤器可以帮我们处理乱码问题。比如客户端请求访问服务器端的HelloServlet,那么在执行HelloServlet之前,会先经过过滤器进行处理。过滤器处理结束后继续访问HelloServlet完成客户端的请求。
就像中学课堂的化学实验:过滤
水倒入瓶中——即客户端的请求
过滤网——即服务器端的过滤器,过滤杂质
水流入瓶中——经过过滤器后水最后进入瓶中
化学实验要过滤的是水中的杂质,而我们使用过滤器是要过滤请求当中会产生的乱码。
拦截器的开发步骤:拦截器在Struts1中需要开发人员手动编写代码来实现。本质上来说过滤器也是一个Servlet,了解Servlet的开发人员就会很容易拦截器开发的注意内容。比如创建一个Servlet需要一个继承HttpServlet的类并且在web.xml中对该Servlet进行配置。那么过滤器是如何设置的呢?(和Servlet的配置有异曲同工之妙)
<!-- 定义过滤器 -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.web.util.FilterServlet</filter-class>
<!-- 定义过滤器的初始化参数 -->
<init-param>
<!-- 参数名称为【encoding】的值为【UTF-8】 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- 设置名过滤器【Set Character Encoding】的映射路径 -->
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<!-- 【*】代表映射到所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
除了配置过滤器之外,还需要与配置相对应的过滤器实现的类文件。文件路径需要和<filter-class>com.web.util.FilterServlet</filter-class>保持一致。代码如下:
package com.web.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterServlet implements Filter {
/**
* 编码类型
*/
protected String encoding;
/**
* 过滤器初始化函数,读取配置参数
*/
public void init(FilterConfig filterConfig) throws ServletException {
// 获取web.xml中定义过滤器是设置的初始化参数【encoding】中的值,此处获得的值为UTF-8
System.out.println("开始获取encoding的值咯!");
this.encoding = filterConfig.getInitParameter("encoding");
}
/**
* 过滤器的处理函数
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("执行过滤器的doFilter()方法咯~");
String encoding = this.encoding;
System.out.println("encoding: " + encoding);
if(encoding != null){
request.setCharacterEncoding(encoding);
}
System.out.println("doFilter()处理完毕开始跳转~");
chain.doFilter(request, response);
}
/**
* 过滤器的销毁函数
*/
public void destroy() {
System.out.println("执行过滤器的destroy()方法咯!");
this.encoding = null;
}
}
这样过滤器的创建和配置就完成了。我们就可以编写功能来测试过滤器是不是起作用了。
下面提供下载的代码,Form表单提交的方式是Post方式,如果改成Get请求仍然会出现乱码,原因我已经在上两篇文章做了说明(http://www.arm4u.com/read.php?tid=36,http://www.arm4u.com/read.php?tid=44)
解决方案如下:
修改当前web应用的服务器Tomcat的配置。找到Tomcat根目录下conf文件夹下的server.xml文件。在<Connector/>节点中添加两个粗体显示的配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" [b]useBodyEncodingForURI="true" URIEncoding="UTF-8"[/b]
redirectPort="8444"/>
useBodyEncodingForURI="true" //设置POST和GET使用相同编码
URIEncoding="UTF-8" //对URI使用utf-8编码处理
这样,不管客户端请求的方式是Get还是Post都不会有乱码问题了。
期待大家的关注,也希望得到宝贵的建议。
分享到:
相关推荐
Jsp和Servlet中文乱码问题
servlet与jsp中文乱码处理,详细介绍多种乱码处理方法,包括使用过滤器的方法
jspservlet取参数乱码问题分析jspservlet取参数乱码问题分析jspservlet取参数乱码问题分析jspservlet取参数乱码问题分析jspservlet取参数乱码问题分析
jsp传参 servlet接收中文乱码问题的解决方法.docx
彻底解决Servlet及jsp解决中文乱码问题
Servlet + Tomcat 中文乱码的解决方法,浏览器把Unicode字符转换为GBK字符,这样页面的内容和浏览器的显示模式都设成了GBK,就不会乱码了
讲述javaweb开发中的jsp乱码问题 get、post的区别 http协议的图解
解决jsp+servlet开发中的中文乱码问题
F:\文档\PDF格式学习资料\主题:Java Web开发(JSP、Servlet)乱码终极解决方案.txtF:\文档\PDF格式学习资料\主题:Java Web开发(JSP、Servlet)乱码终极解决方案.txtF:\文档\PDF格式学习资料\主题:Java Web开发...
下面小编就为大家带来一篇jsp传参 servlet接收中文乱码问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
jsp+servlet+mysql乱码解决的 累积各路方法 最终终成正果
彻底解决servlet中文乱码问题,对于gbk、utf-8、iso-8859-1之间的选择,做了详细的讲解!
乱码总结,其中包括java,servlet,jsp,struts2,等,属个人总结,仅提供参考
本文档详细地介绍了如何解决MySql数据库中的中文乱码问题,此问题的解决将极大地帮助基于MySql的PHP编程、JSP编程、Servlet编程及C#或.Net编程!测试过的开发平台包括 Netbeans和Eclipse。测试过的服务器包括Apache、...
最简单的写法 只要JSP页面的 编码格式和 web.xml 编码格式一样就行
JSP Servlet 汉字编码问题 乱码解决方法
jsp和servlet操作mysql中文乱码问题的解决办法.docx
JSP_利用Filter解决Servlet输出中文乱码的问题.docx
NULL 博文链接:https://fen9ye.iteye.com/blog/1149039