我在tapestry 5.2应用程序中遇到过这个问题:
表单要求请求方法为POST,而t:formdata 查询参数有值。
在访问日志中,我发现有时会有来自不同用户的表单提交GET方法。虽然,根据文档,Tapestry 5使用post-redirect-get方案。此页面不允许匿名访问,因此它不能是机器人。所以我很沮丧这个问题的原因。 建议请。
表单上有几个由Ajax刷新的选项。
编辑2.此类GET请求来自用户而不是机器人,因为已成功登录该ips。
答案 0 :(得分:0)
我会猜测并说它是一个抓取您的生产网站的网络抓取工具。您可能希望customise tapestry's exception handling隐藏网络抓取工具的例外情况。
您通常可以通过用户代理请求标头检测网络抓取工具。
有关已知机器人的列表,请参阅here。
答案 1 :(得分:0)
我注意到form
组件具有以下内容:
Object onAction(EventContext context) throws IOException {
...
executeStoredActions();
...
}
private void executeStoredActions()
{
String[] values = request.getParameters(FORM_DATA);
if (!request.getMethod().equals("POST") || values == null)
throw new RuntimeException(messages.format("invalid-request", FORM_DATA));
}
...
}
这意味着它将处理来自其自身和任何嵌套组件的所有“操作”事件。我不认为你有一个嵌套组件触发“action”事件(例如actionlink)而不处理/中止事件?这些事件会“冒泡”到表单处理程序并导致错误。
请参阅here了解事件可能“冒泡”的原因。
答案 2 :(得分:0)
这是一个老问题,但万一其他人在搜索中偶然发现它......你可以“装饰”Tapestry的RequestExceptionHandler以捕获此异常并将用户重定向到他们可能想要的页面。
有关实现此目的的代码,请参阅Tapestry Specific Errors常见问题解答: