3

我正在使用Struts2.3.28。当我提交它使用submit标签与method属性的形式,我得到这样的警告:Struts2警告:参数与接受的模式不匹配

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。

我觉得这acceptParamNames属性为ParametersInterceptor(排序白名单,似乎)在最近的一些版本中加入......该文档只是说(基本上)

“不要碰这个” 。

太棒了!那么,如果我仍然想使用submit标记的method属性,我该怎么办?

更多信息:对此我不清楚此警告的含义。如果该模式不匹配白名单(acceptParamNames)和黑名单(excludeParams)(ah,一致性),那么应该发生什么?

+0

你确定使用2.3.28吗?您是否修改了接受或排除的模式?无法在我的项目中重现您的问题。 –

+0

也许你需要设置devmode? https://struts.apache.org/docs/devmode.html – leonbloy

+1

[默认排除模式](https://github.com/apache/struts/blob/support-2-3/xwork-core/src/main/ java/com/opensymphony/xwork2/security/DefaultExcludedPatternsChecker.java#L21)排除''方法:''和'isExcluded' [before before](https://github.com/apache/struts/blob/support-2-3/ xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java#L386)'isAccepted'。你有没有修改排除模式? –

回答

1

这是从该方法调用的显影剂通知

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操作管理。

注:

使用ParameterNameAware可能是危险的,因为 ParameterNameAware#acceptableParameterName(String)优先 超过ParametersInterceptor这意味着如果ParametersInterceptor 豁给定的参数名称可以用 ParameterNameAware#acceptableParameterName(String)接受它。


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

注:方法notifyDeveloper只能打印devMode,否则只打印在记录仪的DEBUG模式。您还可以通过将记录器级别更改为TRACE来跟踪按摩。


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

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

2.覆盖的列表中排除模式。 排除模式的默认列表包含排除method:参数(以及action:)的模式。 AleksandrM在comment中也提到过这一点。

欲了解更多信息,请参阅文档params interceptor

+0

要使用DMI,不需要重写排除的模式。 DMI发生在参数映射之前。 –

+0

为更好地理解而更新。 –

+0

我省略了它,因为OP已经删除了这个限制。 –