2012-08-28 192 views
0

我有一个问题导致OOME/Stackoverflow as per this posting,几乎可以肯定现在看起来这是由登录时重复表单提交造成的。这一切都是使用Spring Security插件完成的。有没有办法来防止这种情况?防止在登录时提交重复表单提交

我想过使用useToken/withForm,但无法看到Spring Security如何发布到j_spring_security_check,因此我无法控制这一点。

我正在使用自定义的UserDetailsS​​ervice,并且可以看到如何检查当前会话是否被登录,例如通过RequestContextHolder.requestAttributes.sessionMutex.session.attributes.xyz但不确定这看起来是否正确。

使用Grails 2.0.4

回答

1

“的Grails已经内置支持处理使用重复的表单提交‘同步令牌模式’。要开始,你在表单标签定义一个令牌”

你可以阅读如何在:http://grails.org/doc/latest/guide/single.html#formtokens

+0

谢谢,但对不起,我没有说清楚,这是使用Spring安全插件,它最终发布到j_spring_security_check,所以我无法控制,我可以看到这一点与表单一起使用...不是我仍然可以看到。 – Steve

+0

当您使用Spring Security Plugin时,它会生成标准视图和控制器。您可以使用上述信息编辑views/login/auth.gsp和controller /.../ LoginController.groovy。 –

+0

问题是表单帖子j_spring_security_check,所以你没有一个控制器来处理,我想有一些解决方法,但现在我的自我回答的解决方案似乎很好 – Steve

0

追溯到在自定义UserDetailsS​​ervice中调用的User.save()(例如,更新最后登录时间)的核心问题,Hibernate会话在随后的每个用户的调用中关闭。

将User.save()移动到AuthenticationEventListener.onApplicationEvent(AuthenticationSuccessEvent事件),它工作正常。仍然会很高兴知道如何处理重复的帖子j_spring_security_check