在 Struts 2 中,参数由Parameters Interceptor处理。
查看源代码,你会看到
public static final String ACCEPTED_PARAM_NAMES = "\\w+((\\.\\w+)|(\\[\\d+\\])|(\\(\\d+\\))|(\\['\\w+'\\])|(\\('\\w+'\\)))*";
这意味着它使用以下正则表达式来验证输入:
\w+(
(\.\w+) |
(\[\d+\]) |
(\(\d+\)) |
(\['\w+'\]) |
(\('\w+'\))
)*
在 Java中,
\w
代表“单词字符”。它总是匹配 ASCII 字符[A-Za-z0-9_]
, 然后它接受 ASCII字母、数字和下划线,仅此而已。
哈希中间的减号
sequence['df18df5e-31ca-457e-89c1-14c0ab84e25c']
正在破坏正则表达式,导致参数不被接受。
解决方案是:创建一个正则表达式,它将接受括号内的减号,方法是扩展 the并在末尾\w
添加 a :-
\w+(
(\.\w+) |
(\[\d+\]) |
(\(\d+\)) |
(\['[A-Za-z0-9_\-]+'\]) |
(\('[A-Za-z0-9_\-]+'\))
)*
在 Java 中是
"\w+((\.\w+)|(\[\d+\])|(\(\d+\))|(\['[A-Za-z0-9_\\-]+'\])|(\('[A-Za-z0-9_\\-]+'\)))*"
您现在要做的就是通过将自定义正则表达式作为参数传递给 Interceptor 来覆盖默认正则表达式(该示例使用约定插件,但使用 struts.xml 时相同):
@Action( value = "yourAction",
results = @Result( location = "/yourPage.jsp" ),
interceptorRefs = @InterceptorRef (
value = "defaultStack",
params = { "params.acceptParamNames",
"\w+((\.\w+)|(\[\d+\])|(\(\d+\))|(\['[A-Za-z0-9_\\-]+'\])|(\('[A-Za-z0-9_\\-]+'\)))*"
}
)
)