Spring Security 3 SavedRequestAwareAuthenticationSuccessHandler对POST和GET没有任何影响

时间:2012-12-24 09:26:36

标签: spring spring-security

有这样的问题:当使用spring security 3时,尝试在登录时询问资源(通过GET)或提交表单(通过POST)。所以我重定向到登录表单然后Spring恢复我的原始请求,但它总是作为GET请求恢复(即使我尝试发出POST请求)。所以我想知道如何解决它?或者我可以如何允许spring security仅存储GET请求并跳过POST?

我在DefaultSavedRequest中找到了这样的代码:

public boolean doesRequestMatch(HttpServletRequest request, PortResolver portResolver) {

    ...

    if (!"GET".equals(request.getMethod()) && "GET".equals(method)) {
        // A save GET should not match an incoming non-GET method
        return false;
    }

据我了解,此方法比较缓存请求和传入请求,并且只有当传入请求不是GET且存储请求为GET时,它才会显示请求不等于。所以在我的情况下,存储请求是POST并且传入是GET,所以它返回is等于,所以它工作错误。我该怎么办?这种具体比较是错误还是某种意义?

更新 我重新运行错误,看到我的主要描述不完整。我试着更详细地描述它。我有GET url,打开表单,它通过AJAX提交相同的URL作为带有弹出消息窗口的POST。我执行GET URL,表单打开。比我注销,并尝试提交表单。弹出窗口输出错误。我登录并重定向到URL(对于GET / POST请求是相同的),但是在屏幕上看到不是表单,但是我的AJAX请求的JSON响应和Firebug中我看到登录后执行POST请求。当我在登录后删除缓存过滤器时,我重定向到相同的URL,但它不是作为POST请求,而是像往常一样GET请求并打开表单。

1 个答案:

答案 0 :(得分:2)

正如the manual所述,保存请求处理是一种“尽力而为”的方法。这对所有人来说都不是万能的。它会在执行登录时缓存请求(无论请求方法,GET,POST等),然后在登录后重定向到缓存的URL。

重定向后的传入请求将是GET(例如,您无法重定向到POST),因此它将尽力将此与缓存的请求进行匹配,并决定是否应将缓存的请求用于替换它,因此就好像登录从未发生过一样。

您发布的代码是指用户尝试发出GET请求然后提示登录的情况。如果对同一URL的后续请求不是GET,则是登录后重定向的结果,因此缓存的请求应该用于替换它

您可以使用request-cache命名空间元素自定义RequestCache,或将其替换为无操作实现。如果您不想使用缓存请求,可以设置always-use-default-target配置的form-login属性。