您的位置:首页 > 产品设计 > UI/UE

【javaweb:Proxy&Filter】采用动态代理和过滤器解决request的全局乱码问题

2018-03-06 16:43 906 查看
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 {
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐