package com.rlovep.filter; 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.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet Filter implementation class EncodingFilter */ @WebFilter(urlPatterns="/*") public class EncodingFilter implements Filter { /** * Default constructor. */ public EncodingFilter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain) throws IOException, ServletException { //向下转型 final HttpServletRequest request=(HttpServletRequest)req; HttpServletResponse response=(HttpServletResponse)rsp; //处理公用业务对post方式有效 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;utf-8"); /* * 出现GET中文乱码,是因为在request.getParameter方法内部没有进行提交方式判断并处理。 * String name = request.getParameter("userName"); * * 解决:对指定接口的某一个方法进行功能扩展,可以使用代理! * 对request对象(目标对象),创建代理对象! */ //给request对象增加动态代理,使得当get方式提交时一样可以正常显示 HttpServletRequest proxy=(HttpServletRequest)Proxy.newProxyInstance(request.getClass().getClassLoader(), new Class[]{HttpServletRequest.class},//接口类型 new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null;//执行反射方法调用时的返回值 String methodname=method.getName();//获得方法名 if("getParameter".equals(methodname)){ String value=request.getParameter(args[0].toString()); // 判断如果是GET提交,需要对数据进行处理 (POST提交已经处理过了) if("get".equalsIgnoreCase(request.getMethod())){ if(value!=null && !"".equals(value.trim())) { // 处理GET中文 value=new String(value.getBytes("ISO8859-1"),"UTF-8"); } } return value; } else { //对对象方法掉用。 result=method.invoke(request, args); } return result; } }); //将代理作为request传入 chain.doFilter(proxy, response); } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { // TODO Auto-generated method stub } }