Java动态代理(解决编码问题)

1.1GetPostEncodingFilter过滤器类

public class GetPostEncodingFilter implements Filter {
	public void destroy() {
	}
	public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {
		//强转
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		//创建普通类
		RequestProxy requestProxy = new RequestProxy(request);
		//设置响应类型与编码
		response.setContentType("text/html;charset=UTF-8");
		//发行请求,进入GetPostServlet
		chain.doFilter(requestProxy.getProxy(),response);
	}
	public void init(FilterConfig filterConfig) throws ServletException {
	}
}

1.2HttpServletRequest的动态代理对象

/**
 * @author Administrator
 * 用于产生HttpServletRequest的动态代理对象
 */
class RequestProxy{
	/**
	 * 目标对象
	 */
	private HttpServletRequest request;
	/**
	 * 通过构造器为request设置值
	 */
	public RequestProxy(HttpServletRequest request) {
		this.request = request;
	}
	/**
	 * 产生HttpServletRequest的代理对象(重点)
	 */
	public HttpServletRequest getProxy(){
		return (HttpServletRequest)Proxy.newProxyInstance(
				this.getClass().getClassLoader(), 
				request.getClass().getInterfaces(), 
				new InvocationHandler(){
					public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
						Object returnValue = "";
						String methodName = method.getName();
						if("getParameter".equals(methodName)){
							//获取客户端请求的类型
							String requestType = request.getMethod();
							//如果是GET请求的话
							if("GET".equals(requestType)){
								//获取表单提交的用户名和性别
								String temp = (String) method.invoke(request,args);
								//如果非空
								if(temp!=null && temp.trim().length()>0){
									//转还
									byte[] buf = temp.getBytes("ISO8859-1");
									//手工装配
									returnValue = new String(buf,"UTF-8");
								}
							//如果是POST请求的话
							}else if("POST".equals(requestType)){
								//设置编码方式
								request.setCharacterEncoding("UTF-8");
								//获取表单提交的用户名和性别
								returnValue = method.invoke(request,args);
							}
						}else{
							returnValue = method.invoke(request,args);
						}
						return returnValue;
					}
				});
	}
}


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值