1. 程式人生 > >使用動態代理解決全局亂碼問題

使用動態代理解決全局亂碼問題

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 public
void 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() { } }

動態代理:實際開發中一般用於攔截。判斷不同的角色,決定是否可以調用這個方法。

使用動態代理解決全局亂碼問題