警告:参数与 Struts 中接受的模式不匹配 2
WARN: Parameter didn't match accepted pattern in Struts 2
我正在使用 Struts2.3.28。当我提交使用 submit
tag 和 method
属性的表单时,我收到此警告:
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 Interceptor 的 acceptParamNames
属性(似乎是白名单)是在最近的一些版本中添加的......文档只说(基本上)
"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
属性,您应该:
- 启用DMI:
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
2。覆盖 excluded 模式列表。
默认的排除模式列表包含一个排除 method:
参数(以及 action:
参数)的模式。 AleksandrM 在 .
中也提到了这一点
有关详细信息,请参阅 params
interceptor 的文档。
我正在使用 Struts2.3.28。当我提交使用 submit
tag 和 method
属性的表单时,我收到此警告:
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 Interceptor 的 acceptParamNames
属性(似乎是白名单)是在最近的一些版本中添加的......文档只说(基本上)
"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 asParameterNameAware#acceptableParameterName(String)
takes precedence overParametersInterceptor
which means ifParametersInterceptor
excluded given parameter name you can accept it withParameterNameAware#acceptableParameterName(String)
.
默认模式列表在初始化期间确定(使用默认常量值进行硬编码),因此如果您没有在拦截器配置中使用参数 acceptParamNames
,Struts 将使用其默认模式列表。但是您可以通过将此参数指定给参数拦截器来覆盖参数值。
注意:方法notifyDeveloper
只能在devMode
中打印,否则只能在记录器的DEBUG
模式下打印。您还可以通过将记录器级别更改为 TRACE
.
要使用提交标签的 method
属性,您应该:
- 启用DMI:
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
2。覆盖 excluded 模式列表。
默认的排除模式列表包含一个排除 method:
参数(以及 action:
参数)的模式。 AleksandrM 在
有关详细信息,请参阅 params
interceptor 的文档。