当前位置: 首页 > news >正文

Servlet---请求封装器

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/75804694

    如果前端传入的字符串中包含特殊字符。例如HTML标签 <a href="http://www.baidu.com">百度</a>,传入这种参数会导致后台吧字符串当成了HTML链接。为了避免这种情况的发生,需要过滤用户输入的字符串。
    从Request中可以用 getParameter()方法获取参数,可以将获得的参数进行处理,但是Request却没有类似“setParameter()”的方法。当然,也可以直接重写getParameter,但是就需要接口中的所有方法都重写,非常麻烦。
    HttpServletRequestWrapper类使用了HttpServletRequest接口,并实现了所有的方法,使用时只需集成该类,并重写需要的特定方法即可。

WrapperTest继承自HttpServletRequestWrapper,并重写了getParameter,构造函数传入的是真正的Request,可以使用getRequest()获取它,之后可以通过过滤器用WrapperTest替换HttpServletRequest

public class WrapperTest extends HttpServletRequestWrapper {

    // 传入真正的request
    public WrapperTest(HttpServletRequest request) {
        super(request);
    }

    // 处理从request中获得的参数
    public String getParameter(String name) {
        String result = this.getRequest().getParameter(name);
        // 使用StringEscapeUtils过滤特殊字符
        return StringEscapeUtils.escapeHtml3(result);
    }
}

用WrapperTest替换HttpServletRequest,doFilter()中将WrapperTest传入,之后的Servlet就会从WrapperTest中获得参数,而不是从HttpServletRequest中获得。

public class WrapperFilter implements Filter {

    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        // 创建新的Request
        HttpServletRequestWrapper requestWrapper = new WrapperTest((HttpServletRequest)arg0);

        // 用WrapperTest对象替换HttpServletRequest,使getParameter具有过滤的功能
        arg2.doFilter(requestWrapper, arg1);
    }

    public void init(FilterConfig arg0) throws ServletException {}
    public void destroy() {}
}

直接访问Servlet(http://localhost:8080/Test/hello?html=<a href='http://www.baidu.com>百度</a>

        String html =  req.getParameter("html");
        System.out.println("#"+html);

        结果:
        &lt;a href='http://www.baidu.com'&gt;百度&lt;/a&gt;

相关文章:

  • powershell 远程重启/关闭服务器
  • 多线程剖析
  • 《中国智慧城市规划与建设》第二版
  • HBase原理和基本概念
  • 移动端单指拖 双值旋转缩放(改动版)
  • 强大的PyTorch:10分钟让你了解深度学习领域新流行的框架
  • 如何修改远程桌面3389端口
  • 17.07.24 Linux 7 文件系统管理
  • python日记----2017.7.25
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • 用quicker-worker.js轻松跑一个大数据遍历
  • HttpClient4.2 Fluent API学习
  • 第二天
  • HCNA
  • AR 与 AI 技术是如何让勇士重回王者的?
  • [译] React v16.8: 含有Hooks的版本
  • [译]Python中的类属性与实例属性的区别
  • C++入门教程(10):for 语句
  • docker python 配置
  • IDEA常用插件整理
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Laravel 菜鸟晋级之路
  • Rancher-k8s加速安装文档
  • uva 10370 Above Average
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 以太坊客户端Geth命令参数详解
  • 正则与JS中的正则
  • 如何用纯 CSS 创作一个货车 loader
  • ![CDATA[ ]] 是什么东东
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (六)激光线扫描-三维重建
  • (七)理解angular中的module和injector,即依赖注入
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .bashrc在哪里,alias妙用
  • .Net Memory Profiler的使用举例
  • .NET Remoting学习笔记(三)信道
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET6实现破解Modbus poll点表配置文件
  • .NetCore 如何动态路由
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • ?.的用法
  • @Autowired标签与 @Resource标签 的区别
  • [Angular 基础] - 指令(directives)
  • [BUUCTF 2018]Online Tool
  • [bzoj1912]异象石(set)
  • [C#]winform部署PaddleOCRV3推理模型
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用