javaEE動態代理解決亂碼問題
/*昨天剛接觸到動態代理。
*簡單的學習了一下,跟大家分享下經驗
*/
/*預備知識----去看API的文件
*1.Class類 -- 基礎,要不學下去挺費勁...
*2.Method類 --同上
*3.InvocationHandler類 -- 實現介面,監聽類
*4.Proxy類 -- 返回動態代理物件
*/
/*代理類
*如果實際開發中,setCharacterEncoding不來這麼幹的...
*只是為了練習...
*可以把處理POST語句移動filter裡邊去
*效率又高,程式碼又簡單...*/
package cn.mytheon.web.filter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.security.Principal;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
import javax.servlet.AsyncContext;
import javax.servlet.DispatcherType;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;
public class ServletRequestImpl implements InvocationHandler {
private Object obj = null;
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//編碼處理,獲取請求方式
if(method.getName().equals("getParameter")){
//構建一個查詢method
String pg = (String)obj.getClass().getMethod("getMethod", null).invoke(obj, null);
/*請求方式是GET*/
String result = null;
if(pg.equals("GET")){
//完成獲取引數,改變編碼
result = (String)method.invoke(obj, args);
result = new String(result.getBytes("8859_1"),"utf-8");
return result;
}
//post方法,構造帶參method,執行setCharacterEncoding("utf-8");*/
//構造型參
Class[] cls = new Class[1];
cls[0] = String.class;
//構造實參
Object[] arg = new Object[1];
arg[0] = "utf-8";
//執行語句,改變編碼
obj.getClass().getMethod("setCharacterEncoding", cls).invoke(obj, arg);
return method.invoke(obj, args);
}
return method.invoke(obj, args);
//return "這是一個POST請求";
}
public ServletRequestImpl(Object object) {
this.obj = object;
}
}
/*過濾類
*用Proxy返回一個代理類物件
*把代理類物件,當做它被代理的物件傳遞到下一鏈
*在上面的代理類中,invoke把getParameter方法捕或,把它的返回值進行了轉碼
*/
package cn.mytheon.web.filter;
import java.io.IOException;
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 DemoFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Class cls = ((HttpServletRequest)request).getClass();
ServletRequestImpl sri = new ServletRequestImpl(request);
HttpServletRequest req = (HttpServletRequest)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), sri);
System.out.println(req.getParameter("username"));
chain.doFilter(req, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
相關文章
- 10分鐘學會理解和解決MySQL亂碼問題MySql
- 【日誌亂碼】解決Tomcat啟動控制檯亂碼問題Tomcat
- 解決SSH亂碼問題
- 解決中文亂碼問題
- MySql中文亂碼問題解決MySql
- Jmeter 解決中文亂碼問題JMeter
- Java 解決中文亂碼問題Java
- RDSSQLSERVER解決中文亂碼問題SQLServer
- 解決MySQL中文亂碼問題MySql
- MYSQL亂碼問題解決方法MySql
- flashfxp 亂碼,2種辦法解決flashfxp 亂碼問題
- java中亂碼問題解決方法Java
- mysql亂碼的問題如何解決MySql
- cat 輸出亂碼問題解決
- 解決plsql中中文亂碼問題SQL
- TongWeb下亂碼問題解決思路Web
- 解決使用Git Bash亂碼問題Git
- plsql查詢亂碼問題解決SQL
- 解決 plsql 遇到亂碼的問題SQL
- 解決Mysql匯入亂碼問題MySql
- oracle字元亂碼問題的解決Oracle字元
- 解決Flex裡的亂碼問題Flex
- 徹底解決程式亂碼問題
- springmvc 解決中文亂碼問題SpringMVC
- js解決url中文亂碼問題JS
- JavaWeb 亂碼問題終極解決方案!JavaWeb
- 如何解決PuTTY中文亂碼的問題
- java中解決request中文亂碼問題Java
- SpringMvc解決Restful中文亂碼問題SpringMVCREST
- 解決confluence的亂碼問題
- 解決CentOS 中顯示亂碼問題CentOS
- python 中文亂碼問題解決方案Python
- 設定SecureCRT配色和解決亂碼問題Securecrt
- 讀mysql中文亂碼問題解決方法MySql
- DES加密中文亂碼問題的解決加密
- Jenkins Git 中文亂碼問題解決JenkinsGit
- CentOS中文亂碼問題的解決方法CentOS
- 自定義RedisTemplate,解決Redis亂碼問題Redis