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

本文介绍了一种通过过滤器结合动态代理技术解决servlet和jsp中request全局乱码的方法。通过对getParameter方法进行增强,实现了对各种提交方式下中文字符的正确解析。
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 {
	}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值