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

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

原文地址:https://www.cnblogs.com/jay8576/p/9534944.html

时间: 2024-10-09 04:34:53

使用动态代理解决全局乱码的相关文章

利用filter和动态代理解决全站乱码问题

1.利用filter和动态代理解决全站乱码问题 1.1filter的代码 package com.baowei.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

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

使用动态代理解决请求中文乱码问题 1.增强一个类我们常用的几种解决方案: 1.继承 a) 优点简单 b) 必须有被增强类的实现类 2.装饰者模式 a) 要求:1实现相同的接口.2持有被增强的对象 b) 优点:不必知道被增强的实现是谁 c) 缺点:必须实现所有没被增强方法的原始对象的原样调用 3.动态代理 a) 要求:1实现相同接口,2持有被增强的对象 b) 优点:不必手动实现所有不增强方法的原样调用.对方法进行增强时有类似过滤器的功能. c) 缺点:学习成本高. 代理(Proxy): 一个代理对

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

一般情况,在每个调用的方法中直接添加日志信息,存在如下问题: 1.代码混乱:越来越多的非业务需求加入(如日志和验证等)后,原有的业务方法急剧膨胀,每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点: 2.代码分散:以日志需求为例,只是为了满足这个单一的需求,就不得不在多个模块里多次重复相同的日志代码,如果日志需求发生变化,必须修改所有的模块. 针对以上问题,使用动态代理带解决. 代理设计模式的原理:使用一个代理将对象包装起来,然后用该代理取代原始对象.任何原始对象的调用都要通过代理.代理对象决

二十二 动态代理&解决网站的字符集编码问题

设计模式: 软件开发过程中,遇到相似问题,将问题的解决方式抽取模型(套路) 单例,工厂,装饰者,适配器,动态代理 谷歌汽车场景: 谷歌汽车场景Car 设计了汽车开发阅读 Interface Icar{  start  run  stop} final class GoogleCar implments ICar(){} 希望将谷歌Car接入到生态圈 装饰者设计模式 场景:二次开发的时候,无法获取源码GoogleCar,无法使用继承的情况下,要对已经存在的对象进行增强 前提:可以获取到被装饰的对象

Java动态代理实现及实际应用

一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础,不会动态代理技术,那么在学习Spring这些框架时是只知应用不懂实现. 动态代理技术就是用来产生一个对象的代理对象的.在开发中为什么需要为一个对象产生代理对象呢? 举一个现实生活中的例子:歌星或者明星都有一个自己的经纪人,这个经纪人就是他们的代理人,当我们需要找明星表演时,不能直接找到该明星,只能是找明星的代理人.比如刘德华在现实生活中非常有名,会唱歌,会跳舞,会拍戏,刘德华在没有出名之前,我们可以直接

动态代理 -- 不用手动编写一个代理对象,不需要编写与目标对象相同的方法,在运行时内存中动态生成代理对象。

动态代理创建的核心代码: TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance( Target.class.getClassLoader(),//与目标对象相同的类加载器 new Class[]{TargetInterface.class}, new InvocationHandler() { @Override //proxy 即该代理对象 //method 代理对象的方法,里面封装这接口中的所有方法 //arg

【JAVAWEB学习笔记】25_基础加强:类加载器、注解 @xxx和动态代理

基础加强 学习目标 案例-自定义单元测试@MyTest 案例-全局的编码的解决 一.类加载器 1.什么是类加载器,作用是什么? 类加载器就加载字节码文件(.class) 2.类加载器的种类 类加载器有三种,不同类加载器加载不同的 1)BootStrap:引导类加载器:加载都是最基础的文件 2)ExtClassLoader:扩展类加载器:加载都是基础的文件 3)AppClassLoader:应用类加载器:三方jar包和自己编写java文件 怎么获得类加载器?(重点) ClassLoader 字节码

简谈Java 反射机制,动态代理

谈谈 Java 反射机制,动态代理是基于什么原理?小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:701136382 这是小编创建的java高阶学习交流群,加群一起交流学习深造.群里也有小编整理的2019年最新最全的java高阶学习资料! 反射机制 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力.可以在运行时通过提供完整的"包名+类名.class"得到某个对象的类型. 功能 在运行时能判断任意一个对象所属的

java开发必学知识:动态代理

目录 1. 引言 2. 代理模式及静态代理 2.1 代理模式说明 2.2 静态代理 2.3 静态代理局限性 3. 动态代理 3.1 JAVA反射机制 3.2 JDK动态代理 3.2.1 JDK动态代理 3.2.2 JDK动态代理与限制 3.4 CGLIB动态代理 4. 动态代理在Spring的应用:AOP 4.1 AOP 概念 4.2 AOP编程 4.2.1 引入aop依赖 4.2.2 定义切面.切点与通知 5. 总结 参考资料 往期文章 一句话概括:java动态代理通过反射机制,可在不修改原代