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