Java中的HttpServletRequestWrapper用法解析
一.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用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java8时间 yyyyMMddHHmmss格式转为日期的代码
这篇文章主要介绍了java8时间 yyyyMMddHHmmss格式转为日期的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-09-09自定义log4j2中的Appender来获取日志内容的示例代码
在 Log4j2 中,Appender 是负责将日志事件输出到目标地点的组件,本文讲述的是通过 log4j 中自定义的 Appender 来获取需要打印的日志信息,文中有详细的代码示例供大家参考,需要的朋友可以参考下2024-02-02IntelliJ IDEA Run时报“无效的源发行版:16“错误问题及解决方法
这篇文章主要介绍了IntelliJ IDEA Run时报“无效的源发行版:16“错误问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-05-05SSM框架中entity mapper dao service controll
这篇文章主要介绍了SSM框架中entity mapper dao service controller层的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-11-11
最新评论