`
cevin15
  • 浏览: 28364 次
  • 性别: 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中文乱码】 在开发Java Web应用时,尤其是在处理包含中文字符的请求时,可能会遇到中文乱码的问题。解决这个问题的一种常见方法是使用Filter过滤器。以下是配置Filter过滤器处理JSP...

    解决tomcat下中文乱码问题

    解决 Tomcat 下中文乱码问题 在本文中,我们将讨论如何解决 Tomcat 下中文乱码问题。该问题是由于 Tomcat 默认的字符编码设置不正确引起的。我们将通过设置 Connector 元素的 URIEncoding 属性和在过滤器中设置字符...

    使用过滤器解决中文乱码问题

    ### 使用过滤器解决中文乱码问题 在Web开发过程中,经常遇到的一个问题是中文或其它非ASCII字符的乱码问题。这种现象通常出现在浏览器接收的数据与实际编码格式不匹配时。解决此类问题的一种常见方法是使用过滤器...

    tomcat过滤器,处理表单提交出现乱码

    为了解决这个问题,我们可以利用Java的Servlet过滤器(Filter)机制来处理请求。 1. **创建过滤器**: 在Java Web应用中,过滤器是实现特定功能的一段代码,可以在请求到达目标Servlet之前或之后进行预处理和后...

    解决Tomcat中文乱码

    - 在`web.xml`中注册这个过滤器,并配置初始化参数`encoding`为`UTF-8`,这样所有经过该过滤器的请求都会被设置为UTF-8编码。 ```xml &lt;filter&gt; &lt;filter-name&gt;SetCharacterEncodingFilter&lt;/filter-name&gt; &lt;filter...

    如何解决Tomcat下中文乱码问题?

    解决方法是创建一个Servlet过滤器(Filter),在请求到达目标Servlet之前,设定请求的字符编码。以下是一个简单的过滤器示例,用于设置请求的字符编码为UTF-8: ```java public class SetCharacterEncodingFilter ...

    彻底解决 Tomcat 5 下文字乱码问题 - JSP日志 - ※一路风尘※

    - Tomcat的日志输出默认使用平台默认编码,可能导致乱码。可以通过修改`logging.properties`文件,为`java.util.logging.ConsoleHandler.encoding`设置为`UTF-8`。 - 如果使用的是自定义日志框架,如Log4j,需在...

    解决tomcat中文乱码问题.doc

    综上所述,通过合理设置JSP页面编码、配置请求过滤器以及进行必要的编码转换,可以有效解决Tomcat环境下中文乱码的问题。在实际应用中,还需要根据具体情况选择合适的解决方案,并注意保持前后端编码的一致性。

    乱码过滤类和配置使用方法

    这个过滤器会确保所有请求和响应都使用UTF-8编码,从而避免乱码问题。 总之,处理乱码问题需要从多方面考虑,包括但不限于编写乱码过滤类和调整系统配置。通过合理的编码策略和配置,我们可以有效地避免和解决乱码...

    STRUTS ActionForm乱码,servlet全局过滤器转义编码。

    Struts框架中的ActionForm乱码问题以及Servlet全局过滤器的转义编码处理是Java Web开发中常见的字符编码问题。在开发基于Struts的Web应用时,乱码主要出现在三个方面:页面显示乱码、参数传递乱码以及国际化资源文件...

    修改tomcat的编码为utf-8

    以上示例使用Spring框架提供的`CharacterEncodingFilter`过滤器来强制所有请求都使用UTF-8编码。这种方法更加灵活,可以根据具体的应用场景来定制。 #### 三、验证修改结果 修改完成后,可以通过以下几种方式来...

    Tomcat和weblogic中文乱码问题解决方案

    在 Tomcat 服务器中,可以使用以下过滤器来解决中文乱码问题: ```java package com; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet....

    filter过滤器流程及中文乱码解决和客户端IP地址控制

    【filter过滤器流程】 在Java Web开发中,Filter(过滤器)是用于处理HTTP请求和响应的重要组件。它遵循Servlet规范中的Filter接口,允许开发者在请求到达目标Servlet或JSP之前以及响应离开Servlet之后进行拦截和...

    如何解决Tomcat下中文乱码问题?文.pdf

    对于POST提交的表单,可以通过创建一个Servlet过滤器(Filter)来解决乱码问题。过滤器会在请求被处理前执行,可以在这里更改请求参数的编码。以下是一个简单的`SetCharacterEncodingFilter`示例: ```java ...

    过滤器,Jsp开发中的避免中文乱码

    过滤器(Filter)在Java Web应用中扮演了重要角色,它可以用来解决这个问题。过滤器是Servlet API的一部分,允许我们在数据请求到达目标资源之前或之后进行拦截和处理,包括对字符编码的转换,从而避免乱码的出现。 ...

    tomcat5中文问题完美解决

    **方法一:实现过滤器(FILTER)设置GBK编码** 1. 参考Tomcat的Servlet-Examples目录下的示例,将 `%TOMCAT安装目录%/WEBAPPS/SERVLET-EXAMPLES/WEB-INF/CLASSES/FILTERS/SETCHARACTERENCODINGFILTER.CLASS` 拷贝到...

    idea启动tomcat项目控制台乱码问题.docx

    如果你的项目包含`web.xml`,确保其中的`&lt;filter&gt;`和`&lt;filter-mapping&gt;`标签用于字符编码过滤器,如`CharacterEncodingFilter`,确保设置正确的编码,例如: ```xml &lt;filter&gt; &lt;filter-name&gt;encodingFilter&lt;/...

    基于tomcat8 编写字符编码Filter过滤器无效问题的解决方法

    基于tomcat8 编写字符编码Filter过滤器无效问题的解决方法 在基于tomcat8 的Web应用程序中,字符编码问题是常见的问题之一。特别是在处理POST请求时,中文字符可能会出现乱码的情况。为了解决这个问题,我们可以...

    Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决篇

    使用过滤器统一设置编码 - 创建一个过滤器类`SetCharacterEncodingFilter`,该过滤器会在请求到达控制器之前设置正确的编码。 - 配置过滤器类: ```java package com.ruder.filters; import java.io....

    java过滤器的使用

    在Web应用中,由于编码不一致,中文字符可能会出现乱码,而通过自定义过滤器可以有效地解决这个问题。 首先,让我们了解过滤器的工作原理。在Java Web应用中,过滤器通过实现javax.servlet.Filter接口并重写其...

Global site tag (gtag.js) - Google Analytics