SpringBoot中通过Filter新增请求参数


SpringBoot中通过Filter新增请求参数

SpringBoot中,可以通过Filter实现对请求参数的加强,包括新增及修改参数。
可以利用这个方式,实现在SpringBoot中预防攻击对有工具性的参数进行调整。
另外,利用这种方式,还可以实现对必须传入的参数设置初始值。

实现方式:

通过实现javax.servlet.http.HttpServletRequestWrapper类来实现

实现步骤:

  1. 新建一个类,实现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;
    }
}
  1. 向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() {

    }
}
  1. 新建一个测试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";
    }

}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM