首页 > 其他 > 详细

request对象添加额外的参数

时间:2019-05-10 18:09:19      阅读:205      评论:0      收藏:0      [点我收藏+]

分析在很多的业务场景中会,过滤器的存在。过滤器的存在主要作用是past非法请求参数。

但是也可以动态进行添加请求参数。

比如说动态的添加当前请求的唯一ID标识、转义一些非法的或者具有工具性的字符(XSS)。

 

实现:为了能够改变请求参数,要重写javax.servlet.http.HttpRequestWrapper这个类.   

然后定义一个成员Map变量,用于存储request请求参数,覆盖getParameter()方法。

package com.eastrobot.robotdev.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

/**
 * <p>向filter过滤器中的request对象添加额外的参数</p><br>
 * TODO(重写 HttpServletRequestWrapper)
 *
 * @author han.sun
 * @version 1.0.0
 * @since 2019/5/5 13:42
 */
public class RequestParameterWrapper extends HttpServletRequestWrapper {

    private Map<String, String[]> params = new HashMap<>();


    /**
     * 获取所有参数名
     *
     * @return all parameter names
     */
    @Override
    public Enumeration<String> getParameterNames() {
        Vector<String> vector = new Vector<>(params.keySet());
        return vector.elements();
    }


    @Override
    public Map<String, String[]> getParameterMap() {
        return params;
    }


    /**
     * 重载构造函数
     *
     * @param request HttpServletRequest
     */
    public RequestParameterWrapper(HttpServletRequest request) {
        super(request);
        //将现有parameter传递给params
        this.params.putAll(request.getParameterMap());
    }

    /**
     * override构造器
     *
     * @param request     HttpServletRequest
     * @param extraParams 自定义参数Map
     */
    RequestParameterWrapper(HttpServletRequest request, Map<String, Object> extraParams) {
        this(request);
        addParameters(extraParams);
    }

    /**
     * 添加参数
     *
     * @param extraParams 自定义参数Map
     */
    private void addParameters(Map<String, Object> extraParams) {
        for (Map.Entry<String, Object> entry : extraParams.entrySet()) {
            addParameter(entry.getKey(), entry.getValue());
        }
    }


    /**
     * 添加参数
     *
     * @param name  key
     * @param value value
     */
    private void addParameter(String name, Object value) {
        if (value != null) {
            if (value instanceof String[]) {
                params.put(name, (String[]) value);
            } else if (value instanceof String) {
                params.put(name, new String[]{(String) value});
            } else {
                params.put(name, new String[]{String.valueOf(value)});
            }
        }
    }

    /**
     * 重写getParameter,参数从当前类中的map获取
     *
     * @param name key
     * @return value
     */
    @Override
    public String getParameter(String name) {
        String[] values = params.get(name);
        if (values == null || values.length == 0) {
            return null;
        }
        return values[0];
    }

    /**
     * 重写getParameter,参数从当前类中的map获取
     *
     * @param name key
     * @return value
     */
    @Override
    public String[] getParameterValues(String name) {
        return params.get(name);
    }


}

 

业务场景:在自定义一个参数过滤器,实现Filter接口,重写doFilter()方法.

package com.eastrobot.robotdev.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>filter---参数过滤器</p><br>
 * TODO(设置自定义request参数)
 *
 * @author han.sun
 * @version 1.0.0
 * @since 2019/5/5 13:12
 */
public class RequestParameterFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        Map<String, Object> map = new HashMap<>(16);
     // 具体的业务场景,需要添加的字段 map.put(
"imgId", new String[]{System.currentTimeMillis() + ""}); RequestParameterWrapper requestParameterWrapper = new RequestParameterWrapper(request, map); chain.doFilter(requestParameterWrapper, servletResponse); } @Override public void destroy() { } }

 

备注:以上效果修改请求参数、添加字段的条件:

1、当接口请求参数没有请求该字段。(可以添加param以及它的value)

2、接口请求了该字段,但是为NULL。(可以修改该字段value)

3、接口请求了该字段,但是不为NULL。(Filter失效,如果使用springmvc,当接口请求到controller层后,该字段会是原来的value,而不是Filter过滤后的)

4、补充3说明的,如果使用request.getParameter("##"),那么就可以实现。

 

request对象添加额外的参数

原文:https://www.cnblogs.com/han-sun/p/10845689.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!