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";
}
}