使用过滤器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 {		public request(httpservletrequest request) {			super(request);		}		public string tochi(string para) {			try {				byte[] bytes = para.getbytes("iso8859-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);		}		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参数,用来指定我们所使用的字符编码。

<div style="text-align: center">--------------------------------------------事情还有后续----------------------------------------

猜你喜欢

转载自haouziwefe.iteye.com/blog/1164211
今日推荐