SpringBoot中通过Filter新增请求参数
SpringBoot中,可以通过Filter实现对请求参数的加强,包括新增及修改参数。
可以利用这个方式,实现在SpringBoot中预防攻击对有工具性的参数进行调整。
另外,利用这种方式,还可以实现对必须传入的参数设置初始值。
实现方式:
通过实现javax.servlet.http.HttpServletRequestWrapper类来实现
实现步骤:
- 新建一个类,实现javax.servlet.http.HttpServletRequestWrapper类,并重写相关方法
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;
public class MyParamsWraper extends HttpServletRequestWrapper {
//这里map需要指定为 Map<String, String[]> 类型
private Map<String, String[]> params = new HashMap<>();
/**
* 构造方法,将原有请求中的参数复制到当前类的params中
* @param request
*/
public MyParamsWraper(HttpServletRequest request) {
super(request);
params.putAll(request.getParameterMap());
}
public void addParameter(String key, Object value) {
if(value != null) {
this.params.put(key, new String[] {String.valueOf(value)});
}
}
/**
* 如果在SpringBoot中用对象来接收参数,这个方法就必须重写
* @return
*/
@Override
public Enumeration<String> getParameterNames() {
return new Vector(this.params.keySet()).elements();
}
/**
* 这个方法必须重写
* @param name
* @return
*/
@Override
public String[] getParameterValues(String name) {
String[] values = this.params.get(name);
if((values == null) || (values.length == 0)) {
return null;
}
return values;
}
}
- 向SpringBoot中添加一个过滤器
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
//使用@WebFilter注解向SpringBoot中添加Filter
//urlPatterns : 要过滤的请求路径
@WebFilter(filterName = "paramsFilter", urlPatterns = "/params")
public class ParamsFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//新建一个自己定义的HttpServletRequestWrapper对象,将当前的servletRequest传进去
MyParamsWraper requestParamsWrapper = new MyParamsWraper((HttpServletRequest) servletRequest);
//添加参数
requestParamsWrapper.addParameter("param1", "1111");
requestParamsWrapper.addParameter("param2", "2222");
//执行Filter,这里传入的Reqeust为刚才新建的自定义的HttpServletRequestWrapper对象
filterChain.doFilter(requestParamsWrapper, servletResponse);
}
@Override
public void destroy() {
}
}
- 新建一个测试Controller进行测试
import com.test.params.vo.ParamsVO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
//测试Controller
//这里获取参数,可以分别获取,也可以用对象来接收
@RestController
public class ParamsController {
// @GetMapping("/params")
// public String params(@RequestParam(name = "param1") String param1,
// @RequestParam(name = "param2") String param2) {
//
// System.out.println("param1 is " + param1);
// System.out.println("param2 is " + param2);
//
//
// return "params";
// }
@GetMapping("/params")
public String params(ParamsVO params) {
System.out.println("param1 is " + params.getParam1());
System.out.println("param2 is " + params.getParam2());
return "params";
}
}