/*昨天刚接触到动态代理。
*简单的学习了一下,跟大家分享下经验
*/
/*预备知识----去看API的文档
*1.Class类 -- 基础,要不学下去挺费劲...
*2.Method类 --同上
*3.InvocationHandler类 -- 实现接口,监听类
*4.Proxy类 -- 返回动态代理对象
*/
/*代理类
*如果实际开发中,setCharacterEncoding不来这么干的...
*只是为了练习...
*可以把处理POST语句移动filter里边去
*效率又高,代码又简单...*/
package cn.mytheon.web.filter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.security.Principal;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
import javax.servlet.AsyncContext;
import javax.servlet.DispatcherType;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;
public class ServletRequestImpl implements InvocationHandler {
private Object obj = null;
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//编码处理,获取请求方式
if(method.getName().equals("getParameter")){
//构建一个查询method
String pg = (String)obj.getClass().getMethod("getMethod", null).invoke(obj, null);
/*请求方式是GET*/
String result = null;
if(pg.equals("GET")){
//完成获取参数,改变编码
result = (String)method.invoke(obj, args);
result = new String(result.getBytes("8859_1"),"utf-8");
return result;
}
//post方法,构造带参method,执行setCharacterEncoding("utf-8");*/
//构造型参
Class[] cls = new Class[1];
cls[0] = String.class;
//构造实参
Object[] arg = new Object[1];
arg[0] = "utf-8";
//执行语句,改变编码
obj.getClass().getMethod("setCharacterEncoding", cls).invoke(obj, arg);
return method.invoke(obj, args);
}
return method.invoke(obj, args);
//return "这是一个POST请求";
}
public ServletRequestImpl(Object object) {
this.obj = object;
}
}
/*过滤类
*用Proxy返回一个代理类对象
*把代理类对象,当做它被代理的对象传递到下一链
*在上面的代理类中,invoke把getParameter方法捕或,把它的返回值进行了转码
*/
package cn.mytheon.web.filter;
import java.io.IOException;
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;
public class DemoFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Class cls = ((HttpServletRequest)request).getClass();
ServletRequestImpl sri = new ServletRequestImpl(request);
HttpServletRequest req = (HttpServletRequest)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), sri);
System.out.println(req.getParameter("username"));
chain.doFilter(req, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}