案例六:通过动态代理解决全网站的post和get方式乱码

关于动态代理的介绍可以看这篇文章详情

下面直接贴出Filter的代码:

package blog.csdn.net.web;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Map;
import java.util.Set;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 用于解决全站get、post请求参数乱码问题以及响应请求乱码问题的Filter 用到动态代理技术
 * 
 * @author Lucky
 * 
 */
@WebFilter(urlPatterns = "/*")
public class GenericEncodingFilter implements Filter {

	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 强转
		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
		HttpServletResponse httpServletResponse = (HttpServletResponse) response;
		
		// 解决响应乱码问题
		httpServletResponse.setContentType("text/html;charset=utf-8");

		// 通过Proxy.newProxyInstance()方法获得代理对象
		HttpServletRequest proxyRequest = (HttpServletRequest) Proxy.newProxyInstance(
				GenericEncodingFilter.class.getClassLoader(), httpServletRequest.getClass().getInterfaces(),
				new MyInvocationHandler(httpServletRequest));
		
		// 这里放行的时候,传入的是HttpServletRequest接口实现类的代理对象,客户端在执行getParameterXxx()方法的时候就会先执行代理类的逻辑
		chain.doFilter(proxyRequest, httpServletResponse);

	}

	public void destroy() {
		// TODO Auto-generated method stub

	}

	/**
	 * 对方原HttpServletRequest的getParameter/getParameterValues/getParameterMap方法进行增强处理的Handler
	 * 
	 * @author mChenys
	 *
	 */
	class MyInvocationHandler implements InvocationHandler {
		private HttpServletRequest httpServletRequest;

		public MyInvocationHandler(HttpServletRequest httpServletRequest) {
			this.httpServletRequest = httpServletRequest;
		}

		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			if (httpServletRequest.getMethod().equalsIgnoreCase(("get"))) {
				/**
				 * 处理get方式提交参数乱码的问题
				 */
				if (method.getName().equals("getParameter")) {
					// 处理调用getParameter()方法时的参数乱码问题
					String value = (String) method.invoke(httpServletRequest, args);
					return new String(value.getBytes("ISO8859-1"), "utf-8");// 返回处理乱码后的值,这里是单个值
				} else if (method.getName().equals("getParameterMap")) {
					// 处理调用getParameterMap()方法时参数乱码的问题
					Map<String, String[]> map = (Map<String, String[]>) method.invoke(httpServletRequest, args);
					Set<String> keySet = map.keySet();
					for (String key : keySet) {
						String[] values = map.get(key);
						for (int i = 0; i < values.length; i++) {
							values[i] = new String(values[i].getBytes("ISO8859-1"), "utf-8");
						}
					}
					return map;
				} else if (method.getName().equals("getParameterValues")) {
					String[] values = (String[]) method.invoke(httpServletRequest, args);
					for (int i = 0; i < values.length; i++) {
						values[i] = new String(values[i].getBytes("ISO8859-1"), "utf-8");
					}
					return values;// 返回处理乱码后的多个值
				}

			} else if (httpServletRequest.getMethod().equalsIgnoreCase(("post"))) {
				/**
				 * 处理post方式提交参数的乱码问题
				 */
				httpServletRequest.setCharacterEncoding("utf-8");
				return method.invoke(httpServletRequest, args);
			}
			// 不需要加强的方法 调用 原有的逻辑,
			return method.invoke(httpServletRequest, args);
		}

	}
}

猜你喜欢

转载自blog.csdn.net/mchenys/article/details/81307188
今日推荐