
Spring 的 @RequestParam 默认区分大小写,若需严格校验 URL 中查询参数名(如 Status)是否与注解中声明的 name="status" 完全一致(含大小写),需通过自定义 Servlet Filter 拦截请求并统一规范化参数键名。
spring 的 @requestparam 默认区分大小写,若需严格校验 url 中查询参数名(如 `status`)是否与注解中声明的 `name="status"` 完全一致(含大小写),需通过自定义 servlet filter 拦截请求并统一规范化参数键名。
在纯 Spring(非 Spring Boot)项目中,@RequestParam(name = "status") 仅匹配小写 status 参数名;若客户端传入 ?Status=COMPLETED 或 ?STATUS=COMPLETED,Spring 将直接忽略该参数(Optional.empty()),不会抛出异常,也不会自动转换键名——这是由 ServletRequest.getParameterMap() 的底层行为决定的,且 Spring 未提供开箱即用的大小写归一化机制。
因此,可靠方案是引入一个轻量级 HttpServletRequestWrapper + Filter,在请求进入 DispatcherServlet 前重写参数键名,确保所有查询参数名统一转为小写(或按需转为指定大小写格式)。以下是完整实现:
// LowercaseParameterRequestWrapper.java
public class LowercaseParameterRequestWrapper extends HttpServletRequestWrapper {
private final Map<string string> lowercaseParameterMap;
public LowercaseParameterRequestWrapper(HttpServletRequest request) {
super(request);
this.lowercaseParameterMap = new HashMap();
Enumeration<string> paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String originalName = paramNames.nextElement();
String lowerName = originalName.toLowerCase(); // 统一小写
String[] values = request.getParameterValues(originalName);
lowercaseParameterMap.put(lowerName, values);
}
}
@Override
public String getParameter(String name) {
String[] values = getParameterValues(name);
return (values == null || values.length == 0) ? null : values[0];
}
@Override
public String[] getParameterValues(String name) {
return lowercaseParameterMap.get(name.toLowerCase());
}
@Override
public Enumeration<string> getParameterNames() {
return Collections.enumeration(lowercaseParameterMap.keySet());
}
@Override
public Map<string string> getParameterMap() {
return Collections.unmodifiableMap(lowercaseParameterMap);
}
}</string></string></string></string>
// LowercaseParameterFilter.java
@WebFilter("/*")
public class LowercaseParameterFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
chain.doFilter(new LowercaseParameterRequestWrapper(httpRequest), response);
} else {
chain.doFilter(request, response);
}
}
}
⚠️ 注意事项:
- 此 Filter 必须在
DispatcherServlet之前执行(通过@WebFilter("/*")或在web.xml中配置<filter-mapping></filter-mapping>时置于前端); - 若项目使用
web.xml,需显式注册 Filter 并确保其load-on-startup顺序早于 DispatcherServlet; - 该方案将所有参数名强制转为小写,因此控制器中
@RequestParam(name = "status")能匹配?Status=...、?STATUS=...等任意大小写变体;若需严格拒绝大小写不匹配的参数(即实现题干“校验相等”语义),则应在 Filter 中改为校验原始参数名是否精确等于期望值(如"status"),不匹配时抛出IllegalArgumentException或返回 400 错误; - 避免在 Filter 中修改请求体(POST body),本方案仅处理 query string,不影响
@RequestBody解析。
综上,Spring 原生不支持大小写不敏感的 @RequestParam 匹配,也不提供参数名校验钩子。通过 HttpServletRequestWrapper 实现参数键标准化,是最符合 Servlet 规范、兼容纯 Spring 环境的工程化解决方案。










