使用过滤器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");request.setCharacterEncoding(encode);
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;}}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");}}<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>
http://www.baidu.com/s?wd=这是百度的一个搜索地址,你在wd后面随便填,百度都能正确解码。http://localhost:8015/search/search?userLevel=41001&keyword=这是我的,在keyword后面随便填,chrome上面也可以正确解码,但是ie和火狐不行。