package indi.proxy;
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.http.HttpServletRequest;
/**
* 目的:解决servlet和jsp中request的全局乱码问题,采用过滤器和动态代理实现,不过动态代理在实际开发中一般用于拦截,比如权限拦截,
* 动态代理可以拦截到方法,比过滤器的拦截层次更深!
* @author Administrator
*/
public class EncodingFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//将ServletRequest对象进行转换,使它变成HttpServletRequest对象,这样它的方法更加的丰富,以便后面的调用
HttpServletRequest req=(HttpServletRequest) request;
//接下来使用动态代理技术对request.getParameter()方法进行增强,使它实现无论什么提交方式都可以解决编码问题
HttpServletRequest enhanceRequest = (HttpServletRequest) Proxy.newProxyInstance(
req.getClass().getClassLoader(), //采用反射机制获取req的字节码对象,再获得对应的类加载器
req.getClass().getInterfaces(), //采用反射机制,获取req的字节码对象,再获得它实现的接口的字节码数组
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//获取方法的名称
String methodName = method.getName();
//如果方法名为getParameter,那么我们就对它进行增强
if("getParameter".equals(methodName)) {
String invoke = (String) method.invoke(req, args);
invoke=new String(invoke.getBytes("iso8859-1"),"UTF-8");
return invoke;//getParameter()方法的返回值我们对它进行了增强,使原参数为中文,则返回值也是中文
}
return method.invoke(req, args);//其它的非getParameter()方法,采用默认返回值
}
}
);
//最后放行,注意:放行的request是我们增强后的enhanceRequest
chain.doFilter(enhanceRequest, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
【javaweb:Proxy&Filter】采用动态代理和过滤器解决request的全局乱码问题
最新推荐文章于 2023-01-14 17:36:54 发布
本文介绍了一种通过过滤器结合动态代理技术解决servlet和jsp中request全局乱码的方法。通过对getParameter方法进行增强,实现了对各种提交方式下中文字符的正确解析。
3415

被折叠的 条评论
为什么被折叠?



