使用动态代理解决全局乱码

Posted jay8576

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用动态代理解决全局乱码相关的知识,希望对你有一定的参考价值。

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中,才能过滤所有



















以上是关于使用动态代理解决全局乱码的主要内容,如果未能解决你的问题,请参考以下文章

在Filter中使用动态代理解决请求中文乱码问题

scrapy按顺序启动多个爬虫代码片段(python3)

动态代理应用-过滤器Filter

eclipse中修改tomcat的配置,解决全局性的get提交乱码问题

IDEA解决中文乱码问题

使用动态代理解决方法调用前后添加日志信息