在客户端以get或者post方式提交数据时,可能会出现客户端与服务端编码集不匹配而发生乱码的现象。
在对post方式产生的乱码我们可以用 request.setCharacterEncoding("utf-8") ; 语句来解决。
在对get方式产生的乱码我们可以用 String s = request.getParameter("xxx");
s = new String(s.getBytes("ISO-8859-1"),"utf-8"); 这样的方式来解决
因为每个页面都需要乱码处理,所以我们可以将解决乱码方式与Filter结合起来,用装饰模式来增强request以实现彻底解决乱码格式。
代码如下
package filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 通过加强request完全解决乱码问题 get/post
*
* @author seawind
*
*/
public class EncodingFilter2 implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 解决post乱码
request.setCharacterEncoding("utf-8");
// 解决get 通过装饰模式 加强getParameter
MyEncodingRequest myEncodingRequest = new MyEncodingRequest(
(HttpServletRequest) request);
chain.doFilter(myEncodingRequest, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
class MyEncodingRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
// 加强方法,解决get乱码问题
@Override
public String getParameter(String name) {
// 获得原来的值
String value = request.getParameter(name);
// 判断用户提交方式
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
// post提交
return value;
}
// 如果value 为 null呢
if (value == null) {
return null;
}
try {
// 解决get方式乱码
value = new String(value.getBytes("ISO-8859-1"), "utf-8"); // 通过encode
// 和
// decode
// 看效果是否相同
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
}
public MyEncodingRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
}