【问题标题】:WARN: Parameter didn't match accepted pattern in Struts 2警告:参数与 Struts 2 中接受的模式不匹配
【发布时间】:2016-03-26 13:48:10
【问题描述】:

我正在使用 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 属性(似乎是一个白名单)是在最近的一些版本中添加的......文档只说(基本上)

“不要碰这个” .

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

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

【问题讨论】:

  • 你确定你使用的是 2.3.28 吗?您是否修改了接受或排除的模式?无法在我的项目中重现您的问题。
  • 也许你需要设置 devmode ? struts.apache.org/docs/devmode.html
  • Default exclude pattern 不包括 method:isExcluded comes before isAccepted。您是否修改了排除模式?
  • @AleksandrM 是的,我已经取消了这个限制。
  • 这回答了为什么您会看到确切的消息。但是 DMI 应该仍然可以工作,对吧?如果不是,那么很难说出为什么没有其他信息。

标签: regex parameters configuration struts2 struts2-interceptors


【解决方案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 的文档。

【讨论】:

  • 要使用 DMI,无需覆盖排除的模式。 DMI 发生在参数映射之前。
  • 已更新以便更好地理解。
  • 有些误会。即使使用默认模式,DMI 也应该可以工作。排除模式适用于不适用于 DMI 的参数。
  • DMI 确实如此,但提交标签会为默认操作映射器生成 URL,只有在启用 DMI 时才会使用此参数。
  • 我仍然不确定我们是否需要覆盖默认的接受模式。我认为,关键是不要将 http 参数与 struts 参数混淆。如果我使用 DMI,则会收到一个 (http) 参数,例如“method:save”。现在,(也许)这被 struts 参数拦截器拒绝是可以的,因为我们不希望它被视为“普通”参数(在操作中调用 setter),而只能由 struts 处理url-to-action+method 映射智能(发生在参数映射之前)。如果这是真的(我不确定),那么第 2 点就不需要了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多