简介:数据传输,通常依赖GET/POST请求,但是都有可能提交中文数据。一般在Serlvet中对中文进行编码处理。Servlet下POST/GET中文乱码的处理方式
我们现在可以将处理乱码交给过滤器(Filter)完成,只需要在Servlet中调用request.getParameter();接收参数即可,而不去关心到底get/post如何处理乱码.
增强request中的getParameter方法的三种方式:
*继承 :控制类的构造即可。
*装饰者模式 :增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用。(缺点):实现接口方法过多查看
*动态代理 :被增强的类实现接口就可以。
package com.itheima.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* 通过动态代理的方式,增强request的getParameter方法来解决中文乱码问题
*
* @author 侯青华
*
*/
@WebFilter(urlPatterns = "/*") //web3.0之后推荐的方式:注解(不使用web.xml配置文件的方式)
public class GenericEncodingFilterDynamicProxy implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request; // 转换为协议相关类型
HttpServletRequest myReq = (HttpServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(),
req.getClass().getInterfaces(), new InvocationHandler() { // new InvocationHandler: 调用处理程序
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 判断方法是否是getParameter,增强getParameter(增强post&&get请求方式)
if ("getParameter".equalsIgnoreCase(method.getName())) {
// 判断请求方式
String type = req.getMethod();
if ("get".equalsIgnoreCase(type)) { // get方式
// 执行getParameter方法获取值,然后,通过new String(Object.getBytes("ISO-8859-1"),
// "UTF-8");解决get请求中文乱码
String value = (String) method.invoke(req, args);
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
return value; // 将处理后的值返回
} else if ("post".equalsIgnoreCase(type)) {
req.setCharacterEncoding("UTF-8"); // post方式解决中文乱码问题
return method.invoke(req, args);
}
}
// 不增强
return method.invoke(req, args);
}
});
chain.doFilter(myReq, response); // 放行
}
@Override
public void destroy() {
}
}
总结: 解决数据传输过程中get/post的方式中文乱码问题,相对于"继承"和"装饰者设计模式",动态代理的方式较为简单明了.推荐使用动态代理模式.