springboot filter 基本使用,这里使用新增参数做示例
一、创建一个转换器,用于参数处理
package com.whoami.monitoring.filter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
/**
* @author :yxl
* @date :2023/12/22 14:35:46
* @desc : some desc
*/
public class ControllerChangeParamWrapper extends HttpServletRequestWrapper {
//因为request.getParameterMap的类型问题,所以定义相同类型的map
private Map<String, String[]> params = new HashMap<>();
/**
* Constructs a request object wrapping the given request.
*
* @param request The request to wrap
* @throws IllegalArgumentException if the request is null
*/
public ControllerChangeParamWrapper(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 此方法的默认行为是在包装的请求对象上返回 getParameterNames()。
*/
@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;
}
}
二、创建自己的Filter类,并实现其方法
package com.whoami.monitoring.filter;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* @author :yxl
* @date :2023/12/22 13:43:44
* @desc : some desc
*/
@Component //注册到Spring
@Order(99)//值越低,优先级越高。默认值为 Ordered,根据具体场景而定
@Slf4j
public class ControllerFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("this is a controller filter");
//转换成Http的request类
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
//创建自定义的转换器,用于参数的添加处理
ControllerChangeParamWrapper controllerChangeParamWrapper = new ControllerChangeParamWrapper(httpServletRequest);
//添加两个参数,这里如果前端传递相同的参数,这个地方会覆盖前面的参数
controllerChangeParamWrapper.addParameter("asd","yxl");
controllerChangeParamWrapper.addParameter("name","aa");
//传递到下一个Filter
chain.doFilter(controllerChangeParamWrapper,response);
}
}
三、创建一个测试的Controller
package com.whoami.monitoring.controller;
import com.whoami.monitoring.util.ResponseData;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
/**
* @author :yxl
* @date :2023/12/14 12:48:15
* @desc : some desc
*/
@RestController
@Slf4j
public class TestController {
@GetMapping("/test")
public ResponseData test(HttpServletRequest request,@RequestParam("asd") String asd,
@RequestParam("name") String name) {
log.info("asd is {} in request param",asd);
log.info("name is {} in request param",name);
request.getParameterMap().forEach((k,v)->{
log.info("key is {} and value is {}",k,Arrays.toString(v));
});
return ResponseData.success();
}
}
这里我为了做比较使用了2中方法来获取参数
四、测试
http://127.0.0.1:8080/test?name=12&age=3
可以看到,通过RequestParam注解接收的参数实际和request.getParameterMap()的参数是分开的,互不影响,下面我们也可以通过断点查看