分析:在很多的业务场景中会,过滤器的存在。过滤器的存在主要作用是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("##"),那么就可以实现。
原文:https://www.cnblogs.com/han-sun/p/10845689.html