警告:参数与 Struts 中接受的模式不匹配 2

WARN: Parameter didn't match accepted pattern in Struts 2

我正在使用 Struts2.3.28。当我提交使用 submit tagmethod 属性的表单时,我收到此警告:

WARN  com.opensymphony.xwork2.interceptor.ParametersInterceptor 
     warn- Parameter [method:save] didn't match accepted 
     pattern [[\w+((\.\w+)|(\[\d+\])|(\(\d+\))|
     (\['(\w|[\u4e00-\u9fa5])+'\])|(\('(\w|[\u4e00-\u9fa5])+'\)))*]]!

我已将 struts.enable.DynamicMethodInvocation 设置为 true

我认为这个 Parameters InterceptoracceptParamNames 属性(似乎是白名单)是在最近的一些版本中添加的......文档只说(基本上)

"don't touch this" .

太棒了!那么,我还想使用submit标签的method属性怎么办呢?

进一步:我不清楚这个警告的含义。如果模式既不匹配白名单 acceptParamNames 也不匹配黑名单 excludeParams(啊,一致性),应该发生什么?

这是从方法调用的开发者通知

 protected boolean isAccepted(String paramName) {
        AcceptedPatternsChecker.IsAccepted result = acceptedPatterns.isAccepted(paramName);
        if (result.isAccepted()) {
            return true;
        }
        notifyDeveloper("Parameter [#0] didn't match accepted pattern [#1]!", paramName, result.getAcceptedPattern());
        return false;
    }

这意味着如果参数名称匹配接受模式列表,那么它就会被这个拦截器传递(在检查名称长度之后,如果它没有被排除)。

新拦截器还检查接受参数值。

参数的白名单和黑名单由ParameterNameAware动作分别管理。

注:

Using ParameterNameAware could be dangerous as ParameterNameAware#acceptableParameterName(String) takes precedence over ParametersInterceptor which means if ParametersInterceptor excluded given parameter name you can accept it with ParameterNameAware#acceptableParameterName(String).


默认模式列表在初始化期间确定(使用默认常量值进行硬编码),因此如果您没有在拦截器配置中使用参数 acceptParamNames,Struts 将使用其默认模式列表。但是您可以通过将此参数指定给参数拦截器来覆盖参数值。

注意:方法notifyDeveloper只能在devMode中打印,否则只能在记录器的DEBUG模式下打印。您还可以通过将记录器级别更改为 TRACE.

来跟踪按摩

要使用提交标签的 method 属性,您应该:

  1. 启用DMI:
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>

2。覆盖 excluded 模式列表。 默认的排除模式列表包含一个排除 method: 参数(以及 action: 参数)的模式。 AleksandrM 在 .

中也提到了这一点

有关详细信息,请参阅 params interceptor 的文档。