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

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

eval 遇到 匿名 post方式 row 亂碼 filter over tex

javaweb中常常遇到表單提交後,讀取表單數據亂碼,特別是從request域存取數據最為頻繁
,常用的解決方法就是設置全局亂碼文件碼通過Filter過濾。無論是post方式提交還是get方式都適用。
我用的JDK1.8,用了Lambda表達式,1.8以下的可以用匿名內部類代替
首先創建一個Filter文件,實現代碼如下:

package com.practice.web.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.reflect.Proxy;
import java.util.regex.Pattern;

/**

  • 〈說明〉
  • 〈全局亂碼增強版,使用動態代理解決〉
  • @author lenovo
  • @since 1.0.0
    */
    public class MyEncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {

    //將ServletRequest 強轉為HttpServletRequest 
     HttpServletRequest httpRequest = (HttpServletRequest) request;
    
    //動態代理,接收增強後的HttpServletRequest 
     HttpServletRequest enhanceRequest = (HttpServletRequest) Proxy.newProxyInstance(
    
             httpRequest.getClass().getClassLoader(),//獲取HttpServletRequest 的類加載器
    
             httpRequest.getClass().getInterfaces(),//獲取HttpServletRequest 所實現的所有接口,此處為Filter 接口
    
            //Lambda表達式
             (proxy, method, args) -> {
    
                //用Pattern匹配所有的getParameter*()方法
                 boolean isEqueals = Pattern.matches("getParameter\\w*", method.getName());
    
                 if (isEqueals) {
    
                    //從表單獲取到的參數,此時為亂碼,原因:invokeValue 用UTF-8編碼,但是用ISO8859-1解碼
                     String invokeValue = (String) method.invoke(httpRequest, args);
    
                    //解決亂碼:將invokeValue 用ISO8859-1編碼再用UTF-8解碼
                     invokeValue = new String(invokeValue.getBytes("ISO8859-1"), "UTF-8");
                     return invokeValue;
                 }
    
                //對於其他方法,直接默認返回即可
                 return method.invoke(httpRequest, args);
             });
    
    //最後一步,放行
     chain.doFilter(enhanceRequest, response);

    }

    @Override
    public void destroy() {

    }
    }

web.xml中配置如下:


最後將其置頂於web.xml中,才能過濾所有

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