GET提交而不是POST。挂毯

时间:2013-10-08 11:43:40

标签: get form-submit tapestry

我在tapestry 5.2应用程序中遇到过这个问题:

  

表单要求请求方法为POST,而t:formdata   查询参数有值。

在访问日志中,我发现有时会有来自不同用户的表单提交GET方法。虽然,根据文档,Tapestry 5使用post-redirect-get方案。此页面不允许匿名访问,因此它不能是机器人。所以我很沮丧这个问题的原因。 建议请。

表单上有几个由Ajax刷新的选项。

编辑2.此类GET请求来自用户而不是机器人,因为已成功登录该ips。

3 个答案:

答案 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常见问题解答:

https://tapestry.apache.org/specific-errors-faq.html