javaEE动态代理解决乱码问题

本文介绍了动态代理的基本概念及其在处理HTTP请求参数编码方面的应用,通过使用代理类和反射机制,实现了请求参数的转码处理。此外,文章还展示了如何利用Proxy类创建动态代理对象,并将其应用于过滤器中,进一步优化了请求处理流程。

 /*昨天刚接触到动态代理。

 *简单的学习了一下,跟大家分享下经验

 */

/*预备知识----去看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

 }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值