用Java代理技术改造HttpServletRequest类

2023-05-16

 

【文章标题】用Java代理技术改造HttpServletRequest

【文章作者】曾健生

【作者邮箱】zengjiansheng1@126.com

【作者QQ190678908

【作者声明】本人水平有限,失误之处,敬请各位指出。

*******************************************************************************

 

开发论坛中的模块通常有要解决以下两个问题:

1. 用户的发帖内容可能有一些特殊字符需要进行处理,如HTML的标记,又例如在04闹得沸沸扬扬的“SQL注入漏洞”,就是由于没有对用户提交的数据进行严格的检查而造成的。

2. 为了建设一个良好的论坛环境,防止用户输入不雅的文字,不然会影响论坛的气氛。

 

针对以上两个需要,可以对用户的提交信息进行过滤。

JavaWeb开发中,获取用户通过表单提交的信息一般的途径是使用request. getParameter函数获取提交的内容,接着就对所获取的字符串进行过滤,但这种做法做有一个问题:如果有多处需要进行过滤字符串的操作,难道每次都要重复写吗?有没有更方便的方法?

能否改造HttpServletRequest类,使得能先过滤getParameter函数获取的字符串后返回过滤后的结果呢?理论上没问题的,有一种设计模式叫“Decorator(装饰器)”模式(在本人的博文《打造山寨产品和伪造品的利器——装饰模式》对这种模式进行了讨论(http://blog.csdn.net/newjueqi)),初想一下能解决这个问题。于是就按照装饰器模式的方法进行改造。结果类的框架刚好搭建完毕就傻了眼,为啥,请看图1

                    

                                                 1

 

1只显示了MyHttpServletRequest_temp类需要实现包装的函数的一部分,总共有几十个函数需要重新包装一下,但本人想改写的只是函数getParameter难道为了重写这个方法就要把另外的几十个函数写一遍!

幸好JDK中有一门技术叫“动态代理”(Proxy),利用它能方便地实现我们的需求,使用动态代理能在普通方法调用前后增加处理方法,现在的AOP(Aspect Orient Program, 面向切面编程)就是以动态代理为基础的。

 

动态代理类主要的方法:


        public static Object newProxyInstance(ClassLoader loader,  

                                      Class<?>[] interfaces,  

                                      InvocationHandler h)  

                               throws IllegalArgumentException  

 

这个函数就是创建一个动态类的实例,各个参数的含义如下:

ClassLoader loader :类加载器对象

Class<?>[] interfaces:所实现的接口的Class对象

InvocationHandler h:这个是很重要的参数,定义了一个接口,实现其中的方法

 Object

invoke(Object proxy, Method method, Object[] args)

,能进行的具体代理操作。

 

编写后的完整的代码如下:

 

package newjueqi.net.csdn.filter;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

 

import javax.servlet.http.HttpServletRequest;

 

/**

 * 本类通过动态代理实现了对httpServletRequest中用getParameter函数获取的文字信息

 * 进行过滤

 *

 */

public class MyHttpServletRequest implements InvocationHandler {

 

       //被代理的类的引用

       private HttpServletRequest httpServletRequest;

 

       //传入需要被代理的类

       public MyHttpServletRequest( HttpServletRequest httpServletRequest)

       {

              this.httpServletRequest=httpServletRequest;

       }

      

       //获取动态代理实例

       public HttpServletRequest getInstance()

       {

              HttpServletRequest Request=null;

             

              Request=(HttpServletRequest)Proxy.

                     newProxyInstance(MyHttpServletRequest.class.getClassLoader(),

                                                  httpServletRequest.getClass().getInterfaces(),

                                                  

                                                  this );//自身实现了InvocationHandler接口,所以传this

             

              return Request;

       }

      

       /*

        * 过滤getParameter函数获取的文字信息

        */

       @Override

       public Object invoke(Object obj, Method method, Object[] arg)

                     throws Throwable {

             

              String value=null;

              Object result=null;

             

              //判断当前被调用的方法是否getParameter,如果是就进行信息过滤

              if( method.getName().equals("getParameter")  )

              {

                     value=httpServletRequest.getParameter( (String)arg[0]);

                    

                     //把“bad”替换为"***"

                     value=value.replaceAll("bad", "***");

                    

                     //返回替代后的结果

                     result=value;

              }

              else //如果不是调用方法“getParameter”就不正常处理

              {

                     result=method.invoke( httpServletRequest, arg );

              }

             

              return result;

       }

      

      

 

}

 

 

写了一个简单的页面测试,表单传递的信息含有需要过滤的字符”bad”,如图2

 

                                                        2

 

过滤后的信息如图3所示:

 

                                                        3

 

效果还是不错的^-^

当然了,这个类的过滤功能还可以进一步改进,例如把需要过滤的文字信息写在一个配置文件中,就能方便地维护。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Java代理技术改造HttpServletRequest类 的相关文章

  • 如何在java swing中的每个页面中打印带有页脚的整个JPanel

    好吧 这可能很简单 但想不通 我有一个包含 JTable 的 JPanel JTable 包含很少的行 有时更多 因为我推入其中的表模型取决于数据库 但是 我不使用任何包含 JTable 的 JScolpane 因此 当 JTable 包含
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • Java/JAXB:将具有相同名称但不同属性值的 XML 元素解组到不同的类成员

    我正在尝试根据其属性之一将具有多个 Fields 元素的 XML 解析为不同的类成员 这是 XML
  • 使用 Java 编程式 HTML 文档生成

    有谁知道如何在 Java 中以编程方式生成 HTMLDocument 对象 而不需要在外部生成字符串 然后使用 HTMLEditorKit read 来解析它 我问的两个原因 首先 我的 HTML 生成例程需要非常快 并且我认为将字符串解析
  • 如何在Spring的applicationContext.xml中指定默认范围来请求范围?

    我想让所有 bean 请求默认作用域 但是 Spring 文档说默认作用域是 Singleton 第 3 4 1 和 3 4 2 节http static springsource org spring docs 2 5 x referen
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 您能让 Tomcat 6 stdout.log 文件表现得像 log4j DailyRollingFileAppender 吗?

    我们使用的是 Tomcat 6 的 Windows 安装 默认情况下 我们应用程序的 log4j 输出将转到 catalina base logs stdout log 文件 该日志文件仅在我们重新启动 Tomcat 时滚动 并且文件名始终
  • java 属性文件作为枚举

    是否可以将属性文件转换为枚举 我有一个包含很多设置的属性文件 例如 equipment height equipment widht equipment depth and many more like this and not all a
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Mule/码头设置

    我有一个正在运行的 Mule 应用程序 我想在其上设置 Jetty 来响应 http 请求 以下配置
  • 使用 Maven 3 时 Cobertura 代码覆盖率为 0%

    读完这篇文章后 将 Cobertura 与 Maven 3 0 2 一起使用的正确方法是什么 https stackoverflow com questions 6931360 what is the proper way to use c
  • 将字符串中的字符向左移动

    我是 Stack Overflow 的新手 有一道编程课的实验室问题一直困扰着我 该问题要求我们将字符串 s 的元素向左移动 k 次 例如 如果输入是 Hello World 和3 它将输出 lo WorldHel 对于非常大的 k 值 它
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes

随机推荐

  • Java线程类小结(附思维导图)

    文章标题 Java 线程类小结 xff08 附思维导图 xff09 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjue
  • Java集合类小结(思维导图版)

    文章标题 Java 集合类小结 思维导图版 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 JDK
  • 简单文件分割合并器的Java实现

    文章标题 简单文件分割合并器的 Java 实现 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 JD
  • 层级菜单动态效果的实现

    文章标题 层级菜单动态效果的实现 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 Dreamweav
  • 简单实现邮件系统的界面功能

    文章标题 简单实现邮件系统的界面功能 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 Dreamwe
  • linux多线程编程书籍推荐:linux大牛之路从这几本书开始总结

    linux多线程编程是指基于Linux操作系统下的多线程编程 xff0c 包括多任务程序的设计 xff0c 并发程序设计 网络程序设计 xff0c 数据共享等 Linux系统下的多线程遵循POSIX线程接口 xff0c 称为pthread
  • 动态增加附件上传文件框的实现

    文章标题 动态增加附件上传文件框的实现 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程环境 Dreamw
  • app后端设计(12)--图片的处理

    app上线后 xff0c 不断接受用户的反馈 xff0c 于是 xff0c 反馈非常差的情况下 xff0c 都会有app的改版 一旦app的改版 xff0c 都会有比较大的UI改动 xff0c 一改动UI xff0c 那么图片的尺寸也就必须
  • XML学习笔记(附上思维导图)

    文章标题 XML 学习笔记 附上思维导图 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 作者声明 欢迎转载文
  • 搜索文本内容——Java代码的简单实现(修改版)

    文章标题 搜索文本内容 Java 代码的简单实现 修改版 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 编程
  • 用反射和内省技术实现简单SpringIOC

    文章标题 用反射和内省技术实现简单 SpringIOC 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newjueqi 作者声
  • 在JSP中用自定义标签实现集合的遍历——山寨版c:foreach

    文章标题 在 JSP 中用自定义标签实现集合的遍历 山寨版 lt c foreach gt 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 在 JSTL 中 xff0c 标签
  • 自定义标签学习笔记

    文章标题 自定义标签学习笔记 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c 敬请各位指出 首先对 JSP 中标签的各
  • 练习瑜伽一个半月的感受(附思维导图)

    文章标题 练习瑜伽一个半月的感受 xff08 附思维导图 xff09 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者博客 http blog csdn net newju
  • 一套适合理工类学科的学习法——《千万别恨数学》读后感

    文章标题 一套适合理工类学科的学习法 千万别恨数学 读后感 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 编程环境 JDK 1 6 0 01 作者声明 欢迎转载文章 xff0
  • Java Web开发中路径问题小结

    文章标题 Java Web 开发中路径问题小结 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c 敬请各位指出 Java
  • Java中this的用法

    一 this关键字 1 this的类型 xff1a 哪个对象调用就是哪个对象的引用类型 二 用法总结 1 this data 访问属性 2 this func 访问方法 3 this 调用本类中其他构造方法 三 解释用法 1 this da
  • 带你认识Google 屌炸天的AR项目——Project Tango

    这两年虚拟现实VR和增强现实AR简直火的不要不要的 xff0c 众多巨头都在发力 xff0c Google也推出了自己的AR技术解决方案 xff0c 因为目前介绍Tango的中文资料还比较少 xff0c 所以本人结合官网文档和自己的理解写了
  • 山寨版struts的TokenProcessor类

    文章标题 山寨版 struts 的 TokenProcessor 类 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c
  • 用Java代理技术改造HttpServletRequest类

    文章标题 用 Java 代理技术改造 HttpServletRequest 类 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 x