服务器端获取表单数据的编码解码问题(servlet)
首先需要明确指出的是,这里的服务器是指tomcat。
在页面没有明确指定编码的情况下,客户端通过input标签和字符串向服务器传递两个值param1和param2。如果直接使用request.getParameter()方法来获取值的话,得到的肯定都是乱码,我们需要对其重新进行编码解码,就像下面的代码所示的那样:
new String(req.getParameter("param1").getBytes("iso-8859-1"), "gbk");
这是因为,中文环境下,浏览器会以gbk对传递到服务器的数据进行编码,而服务器端则会默认以iso-8859-1进行解码,如果我们不做相应的处理的话,得到的将会是乱码。
如果每次获取客户端的数据的时候,都要进行编码解码,会显得很麻烦,幸好有个很好的解决方法。我们可以写一个过滤器,在请求到达servlet之前,告诉服务器request的编码是什么。简单的示例如下:
package com.thief.filter; 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 MyFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2) throws IOException, ServletException { request.setCharacterEncoding("gbk"); arg2.doFilter(request, response); } @Override public void destroy() {} }
这时候,在servlet里就可以通过request.getParameter()来直接获取数据了,但是这仅限于input标签传递过来的数据,查询字符串还是按照上述的编码解码过程传递的。
这时候,还有两种解决方案:一是在tomcat 的server配置文件中的 connector下声明 useBodyEncodingForURI=“true” 这个属性;二是在connector元素下配置 URIEncoding来设置URL编码格式,如果不设置默认就是ISO-8859-1。
这两种方案我在tomcat 的bin下的startup.bat命令行窗口下经过检验,是正确的。但是在eclipse的控制台下没有看出效果,这个不知道是什么原因。
参考:http://www.tuicool.com/articles/IbaQza