Java中的HttpServletRequestWrapper用法解析

 更新时间:2024年01月10日 08:30:22   作者:爱学习的小白菜!  
这篇文章主要介绍了Java中的HttpServletRequestWrapper用法解析,HttpServletRequest 对参数值的获取实际调的是org.apache.catalina.connector.Request,没有提供对应的set方法修改属性,所以不能对前端传来的参数进行修改,需要的朋友可以参考下

一.HttpServletRequestWrapper

1.为什么会有HttpServletRequestWrapper类

HttpServletRequest 对参数值的获取实际调的是org.apache.catalina.connector.Request,没有提供对应的set方法修改属性,所以不能对前端传来的参数进行修改,实际场所像过滤xss攻击,获取认证token统一去除token前缀等需要进行请求参数的处理,此时HttpServletRequestWrapper 就应运而生。

2.原理

HttpServletRequestWrapper 采用装饰者模式对HttpServletRequest进行包装,我们可以通过继承HttpServletRequestWrapper 类去重写getParameterValues,getParameter等方法,实际还是调用HttpServletRequest的相对应方法,但是可以对方法的结果进行改装。

3.实战

给所有方法自动提供token字段参数

3.1 新增wrapper类

/**
 * @Auther 
 * @Date 2023-06-06 8:38
 */
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
    /**
     * 定义参数
     */
    private Map<String, String[]> parameterMaps;
    /**
     * @param request
     */
    public MyHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        parameterMaps = new HashMap<>(request.getParameterMap());
    }
    @Override
    public String[] getParameterValues(String name) {
        String[] values = parameterMaps.get(name);
        if (values == null) {
            values = super.getParameterValues(name);
        }
        return values;
    }
    /**
     * 设置参数
     * @param name
     * @param value
     */
    public void setParameter(String name, String... value) {
        parameterMaps.put(name, value);
    }
}

3.2新增 filter类传递MyHttpServletRequestWrapper

/**
 * @Auther 
 * @Date 2023-06-06 8:38
 */
@WebFilter(urlPatterns = {"/**"})
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        MyHttpServletRequestWrapper MyHttpServletRequest = new MyHttpServletRequestWrapper((HttpServletRequest) request);
        MyHttpServletRequest.setParameter("name", "zhangsan");
        chain.doFilter(MyHttpServletRequest, response);
    }
}

3.3结果

结果可以看到 name前端没传,但是因为我们在过滤器设值了name的值所以在controller打印出了name的值,此方法也可以去修改原有参数的值。

二.HttpServletRequest的getInputStream方法和getParameter方法

根据Servlet规范,如果同时满足下列条件,则请求体(Entity)中的表单数据,将被填充到request的parameter集合中(request.getParameter系列方法可以读取相关数据):

  • 这是一个HTTP/HTTPS请求
  • 请求方法是POST(querystring无论是否POST都将被设置到parameter中)
  • 请求的类型(Content-Type头)是application/x-www-form-urlencoded
  • Servlet调用了getParameter系列方法

如果上述条件没有同时满足,则相关的表单数据不会被设置进request的parameter集合中,相关的数据可以通过request.getInputStream()来访问。反之,如果上述条件均满足,相关的表单数据将不能再通过request.getInputStream()来读取。

到此这篇关于Java中的HttpServletRequestWrapper用法解析的文章就介绍到这了,更多相关HttpServletRequestWrapper用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA 2020.1 for Mac 下载安装配置及出现的问题小结

    IDEA 2020.1 for Mac 下载安装配置及出现的问题小结

    这篇文章主要介绍了IDEA 2020.1 for Mac 下载安装配置及出现的问题小结,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 编译大型Java项目class冲突导致报错的解决方案

    编译大型Java项目class冲突导致报错的解决方案

    这篇文章给大家盘点编译大型项目class冲突导致报错的解决方案,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10
  • Java的Dialog和FileDialog你知道啊

    Java的Dialog和FileDialog你知道啊

    这篇文章主要为大家详细介绍了Java的Dialog和FileDialog,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java编程实现计算两个日期的月份差实例代码

    Java编程实现计算两个日期的月份差实例代码

    这篇文章主要介绍了Java编程实现计算两个日期的月份差实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 前后端分离跨域springBoot跨域有效解决问题

    前后端分离跨域springBoot跨域有效解决问题

    这篇文章主要介绍了前后端分离跨域springBoot跨域有效解决问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java.net.ConnectException: Connection refused问题解决办法

    java.net.ConnectException: Connection refused问题解决办法

    这篇文章主要介绍了java.net.ConnectException: Connection refused问题解决办法的相关资料,需要的朋友可以参考下
    2016-12-12
  • java中将汉字转换成拼音的实现代码

    java中将汉字转换成拼音的实现代码

    java中将汉字转换成拼音的实现代码。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • Spring中的Actuator使用详解

    Spring中的Actuator使用详解

    这篇文章主要介绍了Spring中的Actuator使用详解,在生产环境中运行的程序,并不总是稳定、安静、正确的,往往会遇到各式各样的现场状况,这个时候,就需要获取该程序足够多的运行状态信息,然后分析并对其进行有效管理,需要的朋友可以参考下
    2023-09-09
  • Spring Boot使用Servlet及Filter过程详解

    Spring Boot使用Servlet及Filter过程详解

    这篇文章主要介绍了Spring Boot使用Servlet及Filter过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Spring框架学习常用注解汇总

    Spring框架学习常用注解汇总

    这篇文章主要为大家介绍了Spring框架学习中一些经常用的注解汇总及示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10

最新评论