使用動態代理解決全局亂碼問題
阿新 • • 發佈:2018-02-10
cep rri ring 代碼 destroy cat cati vax public
package www.test.web.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.http.HttpServletRequest; public class EncodingFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override publicvoid doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { final HttpServletRequest req = (HttpServletRequest) request; //使用動態代碼解決全局亂碼問題 HttpServletRequest enhanceRequset = (HttpServletRequest) Proxy.newProxyInstance(//loader ,和目標類相同的類加載器 request.getClass().getClassLoader(), // interfaces :代表與目標對象實現的所有接口字節碼對象數組 request.getClass().getInterfaces(), // h : 具體的操作,InvocationHandler接口 new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //對 getParameter 方法進行增強 String name = method.getName();//獲得目標對象的方法名稱 if("getParameter".equals(name)){ String invoke = (String) method.invoke(req, args);//亂碼 //轉碼 invoke = new String(invoke.getBytes("iso8859-1"),"UTF-8"); return invoke; } return method.invoke(req, args); } }); chain.doFilter(enhanceRequset, response); } @Override public void destroy() { } }
動態代理:實際開發中一般用於攔截。判斷不同的角色,決定是否可以調用這個方法。
使用動態代理解決全局亂碼問題