背景
从Controller统一对用户传递给后端的参数进行Sql注入的校验(由于特殊原因,不能在dao层校验),需要对所有的Request进行拦截,获取到里面的参数进行自定义的校验判断。
问题
配置Config类实现WebMvcConfigurer 接口,重写addArgumentResolvers方法,将自定义的HandlerMethodArgumentResolver类加入到resolvers集合中去
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Autowired
private RequestaArgumentRosolver requestaArgumentRosolver;
/**
* 添加自定义控制器参数拦截
*
* @param resolvers
*/
@Override
public void addArgumentResolvers(final List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(requestaArgumentRosolver);
}
}
以下是自定义HandlerMethodArgumentResolver类的代码
@Component
public class RequestaArgumentRosolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(final MethodParameter parameter) {
return true;
}
@Override
public Object resolveArgument(final MethodParameter parameter, final ModelAndViewContainer mavContainer,
final NativeWebRequest webRequest,
final WebDataBinderFactory binderFactory) throws Exception {
return null;
}
}
但是在本地调用后端接口的时候,debug一直进不去自定义参数解析器的逻辑,去网上搜索答案也无果,检查代码也没发现问题。所以决定从DispatcherServlet(入口)一步步去排查
排查步骤
1、debug进入到doDispatch方法中发现HandleAdapter对象中的customArgumentResolves属性和argumentResolvers属性中均包含我的自定义的解析器的,所以确定一点,我是set进去了