1

有这样的问题:使用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,所以它返回是相等的,所以它工作错误。我能用它做什么?在这种特定的比较中是错误还是有某种意义?

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

4

1 回答 1

2

正如手册所说,保存请求处理是一种“尽力而为”的方法。不可能是所有人的全部。它会在执行登录时缓存一个请求(无论是什么请求方法、GET、POST 等),然后在登录后重定向到缓存的 URL。

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

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

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

于 2013-01-10T13:31:11.530 回答