java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > HttpServletRequestWrapper使用解析

SpringMVC中的HttpServletRequestWrapper使用解析

作者:Mu_Mu是一只小白

这篇文章主要介绍了SpringMVC中的HttpServletRequestWrapper使用解析,HttpServletRequestWrapper 采用装饰者模式对HttpServletRequest进行包装,我们可以通过继承HttpServletRequestWrapper类去重写getParameterValues,getParameter等方法,需要的朋友可以参考下

HttpServletRequestWrapper使用解析

产生背景

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

原理

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

例子

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

1)新增wrapper类:

public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper
{
	private final Map<String, String[]> parameterMap;

    /**
     * @param request
     */
    public MyHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        parameterMap = new HashMap<>(request.getParameterMap());
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = parameterMap.get(name);
        if (values == null) {
            values = super.getParameterValues(name);
        }
        return values;
    }

    public void setParameter(String name,  String ...value) {
        parameterMap.put(name, value);
    }
    }

2)新增 filter类传递MyHttpServletRequestWrapper

@Slf4j
@WebFilter(filterName = "myFilter", urlPatterns = {"/**"})
@Component
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        log.info("----------MyFilter---------");
        MyHttpServletRequestWrapper MyHttpServletRequest = new MyHttpServletRequestWrapper((HttpServletRequest) request);
        MyHttpServletRequest.setParameter("age", "50");
        chain.doFilter(MyHttpServletRequest, response);
    }
    
}

3)controller

@RestController
@RequestMapping("wrapper")
@Slf4j
public class RequestWrapperController {

  @RequestMapping("testWrapper")
    public void testWrapper(Integer age, String token) {
        log.info("-----------age :{} ,-------------", age);
        log.info("-----------token :{} ,-------------", token);
    }
}

4)请求样例

在这里插入图片描述

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

在这里插入图片描述

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

您可能感兴趣的文章:
阅读全文