`
cevin15
  • 浏览: 25910 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用过滤器Filter解决tomcat默认编码配置下的传值乱码

阅读更多
最近又拿起jsp+servlet来做项目,遇到了乱码的问题。解决方案很多,这次决定用过滤器来解决传值过程中的乱码问题。当然前提是tomcat没修改过connector配置项中的URIEncoding,即使用tomcat默认的编码配置。
在表单中使用“method”这个属性来指定提交表单时使用的http请求方式。默认是Get方式。
使用Get方式,提交的参数放在请求的url后面,浏览器会对url进行转义。所以,在服务端要用以下代码取得正确的参数,“utf-8”是我使用的页面字符编码。
String str = new String(request.getParameter("str").getBytes("iso-8859-1"),"utf-8");

如果使用的是Post方式,则提交的参数将放在请求的消息体中。这种情况下,只要指定字符串编码就可以了。
request.setCharacterEncoding(encode);


好,下面说一下我使用过滤器解决传值乱码的例子。
首先,写个继承HttpServletRequestWrapper的类,扩展一下servlet提供的request的功能。
	public class Request extends HttpServletRequestWrapper {
     private String encode;
		public Request(HttpServletRequest request, String encode) {
         super(request);
         this.encode = encode;
		}

		public String toChi(String para) {
			try {
				byte[] bytes = para.getBytes("iso-8859-1");
				return new String(bytes, encode);
			} catch (Exception ex) {
			}
			return null;
		}
		
		private HttpServletRequest getHttpServletRequest() {
			return (HttpServletRequest) super.getRequest();
		}

		public String getParameter(String name) {
			return toChi(getHttpServletRequest().getParameter(name));
		}

		public String[] getParameterValues(String name) {
			String values[] = getHttpServletRequest().getParameterValues(name);
			if (values != null) {
				for (int i = 0; i < values.length; i++) {
					values[i] = toChi(values[i]);
				}
			}
			return values;
		}
	}

在上面的类中,我们其实就完成了一件事。在我们使用getParameter(),getParameterValues()取得参数前,先对参数进行了我们之前所说到的第一个动作。

接着,编写一个过滤器。
public class EncodeFilter implements Filter{
	private String encode;
	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpreq = (HttpServletRequest) request;
		if (httpreq.getMethod().equals("POST")) {
			request.setCharacterEncoding(encode);
		} else {
			request = new Request(httpreq, encode);
		}
		chain.doFilter(request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		encode = filterConfig.getInitParameter("encode");
	}
}

这里,我们使用过滤器完成了两个动作。首先,如果请求是Post方式的,则request.setCharacterEncoding(encode);如果请求是Get方式的,则使用我们进行了扩展的Request代替原来的Request,这样就做到了对参数进行转码再取值。
接下来,在web.xml中要配置我们的这个过滤器。
	<filter>
		<filter-name>encodeFilter</filter-name>
		<filter-class>com.ieread.search.filter.EncodeFilter</filter-class>
		<init-param>
			<param-name>encode</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodeFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

在Filter中有个encode参数,用来指定我们所使用的字符编码。

--------------------------------------------事情还有后续----------------------------------------


本来以为问题到此就圆满解决了。谁知道,又发现个问题。怎么描述呢?写个例子吧!
http://www.baidu.com/s?wd=
这是百度的一个搜索地址,你在wd后面随便填,百度都能正确解码。
http://localhost:8015/search/search?userLevel=41001&keyword=
这是我的,在keyword后面随便填,chrome上面也可以正确解码,但是ie和火狐不行。

纠结了一个下午,跟朋友是各种讨论。终于发现了问题所在。
引用
浏览器发送请求时,不管有没有把一个 byte 的数据编成 %xx 的形式,这都不是导致乱码的问题。
问题是出在如果没有预先按某个字符集编成字节,再把各字节转成 %xx 形式的话, 浏览器在发出请求时,一个汉字,是按 GBK 发送 2byte 的数据, 还是按UTF-8发送 3byte 的数据呢
各个浏览器间,不统一。
服务器在接收字节数据后,如果解码使用的字符集与客户端发送的不一致,就导致乱码。

好,知道问题的所在就可以对症下药了。在我们后台对参数进行解码前,如果能得知参数的编码格式就可以进行正确的解码了。以下,是使用正则表达式对参数进行编码的判断。
Pattern p = Pattern.compile("^(?:[\\x00-\\x7f]|[\\xfc-\\xff]" +
		"[\\x80-\\xbf]{5}|[\\xf8-\\xfb][\\x80-\\xbf]{4}|" +
		"[\\xf0-\\xf7][\\x80-\\xbf]{3}|[\\xe0-\\xef][\\x80-\\xbf]" +
		"{2}|[\\xc0-\\xdf][\\x80-\\xbf])+$");
Matcher ma = p.matcher(para);
if(!ma.find()){
	encode = "gbk";
}else{
	encode = "utf-8";
}

在对字符串进行解码前,用正则表达式先进行一下encode的判断。
OK,问题解决~

以上,就是我个人使用过滤器解决tomcat默认编码配置下传值乱码的一个例子。如果有说错误导人的地方,可以在留言中说下。
分享到:
评论
2 楼 cevin15 2011-09-23  
jak&jin 写道
学习了,小强写的文章很不错~~ ,保存起来再说

呃,杰哥...
1 楼 jak&jin 2011-09-23  
学习了,小强写的文章很不错~~ ,保存起来再说

相关推荐

    如何配置Filter过滤器处理JSP中文乱码

    配置Filter过滤器处理JSP中文乱码 参考Tomcat服务器目录webapps的examples示例 简单配置步骤: 1.在项目web.xml文件添加过滤器标记&lt;filter&gt;和&lt;filter-mapping&gt;; 2.实现过滤器代码; 3.对Tomcat服务器conf目录里的...

    解决Linux下Tomcat向MySQL插入数据中文乱码问题

    一、问题 在windows上面使用eclipse开发的项目在windows上面运行一切正常,部署到腾讯云时出现向MySQL数据库中插入数据是中文乱码 ...由于是SSM框架项目,在web.xml中加过过滤器  &lt;filter&gt;  &lt;filter&gt;e

    GetRequestUtf8Filter.java

    解决Get请求中文乱码的方式1、修改tomcat server.xml的编码 2、过滤器 ;本文就是通过过滤器修改,因业务需要兼容,所以写的Get拦截器,本文仅支持Get请求拦截器,本文仅支持Get请求拦截器,本文仅支持Get请求拦截器...

    网页教程《跟姐姐学JSP》

    7. 使用filter过滤请求 7.1. 批量设置请求编码 7.2. 用filter控制用户访问权限 7.3. filter所谓的特性 7.3.1. 请求映射 7.3.2. 过滤链 7.4. filter的详细配置 8. 配置listener监听器 8.1. 使用...

    JAVAWeb全课程笔记( html版)

    目录 ...CSS总结 JavaScript总结 DOM总结 tomcat服务器 ...Servlet Filter 过滤器 HTTP 协议 文件上传和下载 Servlet事件监听器 JavaMail开发 (案例)Estore电子商城 软件国际化 Java基础加强 JQuery Ajax JSON

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    8.8.1 Struts Prepare And Execute Filter过滤器 8.8.2 struts.xml文件配置出错 8.9 精彩回顾 第9章 庖丁解牛 ——揭密Struts2高级技术 9.1 本章学习任务 9.1.1 本章知识体系 9.1.2 实例开发任务 9.2 OGNL表达式...

    jsp超链接中文乱码的解决方法

    直接修改tomcat下的conf/... 您可能感兴趣的文章:jsp中文乱码 jsp mysql 乱码的解决方法JSP XMLHttpRequest动态无刷新及其中文乱码处理JSP+ MySQL中文乱码问题post提交乱码解决方案通过过滤器(Filter)解决JSP的Po

    V512工作室Java web的ppt

    第15章 讲解Servlet过滤器(Filter)技术。 第16章 讲解使用Apache Commons FileUpload实现文件上传,同时讲解了JavaMail和如何运用Apache Commons Email组件发送邮件。 第17章 讲解DAO设计模式和分页显示,同时还...

    《MyEclipse 6 Java 开发中文教程》前10章

    8.7 创建Filter(过滤器) 152 8.8 创建数据库访问层(DAO) 155 8.9 修改Servlet调用后台类 158 8.10 发布,重新发布,运行和测试应用 159 8.11 调试JSP应用 160 8.12 向现有Web项目添加Web开发功能 161 8.13高级设置 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    全书一共被压缩为5个rar,这是第二个!!!! 其他的请看ID:ljtt123(本人...21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    全书一共被压缩为5个rar,这是第五个!!!! 其他的请看ID:ljtt123(本人...21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    全书一共被压缩为5个rar,这是第四个!!!! 其他的请看ID:ljtt123(本人...21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    全书一共被压缩为5个rar,这是第三个!!!! 其他的请看ID:ljtt123(本人...21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...

    jpivot学习总结.doc

    memberReaderClass 设定一个成员读取器,默认情况下 Hierarchy 都是从关系型数据库里读取的,如果你的数据不在 RDBMS 里面的话,你可以通过自定义一个 member reader 来表现一个 Hierarchy 。 3.5. Level 级别 , ...

    Java面试宝典2020修订版V1.0.1.doc

    11、过滤器有哪些作用? 35 12、JSP的常用指令? 35 13、JSP和Servlet中的请求转发分别如何实现? 35 14、JSP乱码如何解决? 36 15、session 和 application的区别? 36 16、jsp有哪些内置对象?作用分别是什么? 36 ...

Global site tag (gtag.js) - Google Analytics