[Servlet]请求封装器、响应封装器

本文介绍了如何使用Servlet的请求封装器和响应封装器来解决过滤请求内容、设置GET请求编码以及实现响应数据压缩等问题。通过自定义的请求和响应包装类,实现了对HttpServletRequest和HttpServletResponse的适配,例如过滤不文明词汇、设置GET请求编码以及生成压缩数据的响应。文章详细阐述了封装器的工作原理和实际操作的关键点,并给出了留言板过滤HTML字符、GET请求编码设置以及响应压缩的实例应用。
摘要由CSDN通过智能技术生成

1. 单纯的过滤器所做不到的事情:

    1) 前面章节介绍的仅仅是没有任何辅助之下的过滤器,但即使这样简单的过滤器也可以实现一些简单的过滤功能,比如测service时长,重设一下编码等等;

    2) 但是上节讲的过滤器却无法满足下列需求:

         i. 直接修改请求request中的内容(比如将请求内容中的一些不文明词汇替换成?#@!等和谐掉),这就需要修改请求Body中的内容,但是HttpServletRequest的API中只有getParameter却没有setParameter;

         ii. 设置GET请求的编码,虽然可以使用HttpServletRequest的setCharacterEncoding来设置编码,但该方法只能修改请求Body的编码,但GET方法的请求参数是在URL中的,之前讲过这只能却请求参数的字节序列再进行转码,因此这也涉及到修改请求request中的内容的问题;

         iii. 输出压缩数据:由于直接在service中使用PrintWriter进行输出了,也就意味着在service服务过程中就已经响应给客户端了,因此无法在service返回后再对输出进行压缩,除非使PrintWriter的输出具有压缩功能,否则PrintWriter并没有提供任何API让你修改输出流中的内容;

    3) 以上这些问题的解决方法看似只能修改HttpServletRequest和HttpServletResponse的源码了,但真的有那么麻烦吗?直接修改源码是非常繁琐的,而且容易产生严重漏洞,还好Servlet/JSP提供了解决方法,那就是请求封装器和响应封装器;


2. 封装器的效果以及如何实现:

    1) 从问题的解决思路出发:适配器思想

        i. 比如上例中要和谐掉request中的不文明词汇,在不做任何修改之前,使用getParameter获取的内容是不文明词汇,但是我们总希望getParameter发生奇迹,可以返回和谐后的词汇,因此我们的思路就是修改getParameter的源码使之具有和谐功能,但遗憾的是我们不希望修改源码;

        ii. 其实方法很简单,我们可以用一个自定义的类,比如MyHttpServletRequest将原来的HttpServletReqeust封装起来,然后在自定义一个getParameter方法,在该方法中调用HttpServletRequest的getParameter得到原始数据,然后在对原始数据进行和谐,再将和谐后的内容返回不就行了吗?

        iii. 也就是MyHttpServletRequest的getParameter将HttpServletRequest的getParameter包装了起来,同时返回了过滤后的数据,那么MyHttpServletRequest不就相当于修改了源码的HttpServletRequest了吗?并且HttpServletRequest的源码一点儿也没修改!

        iv. 接着只要将MyHttpServletRequest对象传给service就行了,在service中调用的都将是MyHttpServletRequest的getParameter,得到的都是和谐过的数据,这就完全解决了问题;

    2) 以上就是一种典型的适配器思想,那就是为了改变一个类的行为,我们不必直接去修改该类的各个方法,而是用另一个类来封装它,即分别定义同名方法(当然方法签名也必须一模一样),然后在各方法中定义自己需要的行为(当然会用到原类各方法得到原始的数据,然后在进行加工返回处理过的数据),而MyHttpServletRequest就是一个封装器(也叫适配器);

    3) 实际操作中的三个关键点:

        i. 并不是直接将HttpServletRequest和HttpServletResponse“封装”起来,一般意义上的封装使之将一个类的对象作为另一个类的数据成员,但是Request和Response并不是类而是接口,直接"封装"接口并不能获得其中的数据;

       

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值