当前位置: 首页 > 知识库问答 >
问题:

Spring Security 3 SavedRequestAwareAuthenticationSuccessHandler对POST和GET没有区别

蔡修远
2023-03-14

有这样问题:当使用spring Security3时,尝试在应该登录时询问资源(通过GET)或提交表单(通过POST)。所以我重定向到log in form,然后spring恢复我的原始请求,但它总是恢复为GET请求(即使我尝试进行POST请求)。所以我在想我该怎么修好它?或者我如何允许spring security只存储GET request而跳过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,所以它返回的是等于,所以它的工作是错误的。我能用它做什么?这样具体的比较是不是有bug或者有什么意义?

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

共有1个答案

金瑞
2023-03-14

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

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

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

您可以使用request-cache命名空间元素自定义requestcache,或者用no-op实现替换它。如果不想使用缓存的请求,可以设置form-login配置的always-use-default-target属性。

 类似资料:
  • 本文向大家介绍HTTP get和post区别?相关面试题,主要包含被问及HTTP get和post区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: GET - 从指定的资源请求数据。 POST - 向指定的资源提交要被处理的数据。 GET:不同的浏览器和服务器不同,一般限制在2~8K之间,更加常见的是1k以内。 GET和POST的底层也是TCP/IP,GET/POST都是TCP链接。

  • 本文向大家介绍get 和 post 请求有哪些区别?相关面试题,主要包含被问及get 和 post 请求有哪些区别?时的应答技巧和注意事项,需要的朋友参考一下 最普遍的答案 回来之后寻思了很久,他到底是想问我什么?我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的。 可能很多人都已经猜到了,他要的答案是: GET使用URL或Cookie传参。而POS

  • 本文向大家介绍post、get的区别相关面试题,主要包含被问及post、get的区别时的应答技巧和注意事项,需要的朋友参考一下 get的参数会显示在浏览器地址栏中,而post的参数不会显示在浏览器地址栏中; 使用post提交的页面在点击【刷新】按钮的时候浏览器一般会提示“是否重新提交”,而get则不会; 用get的页面可以被搜索引擎抓取,而用post的则不可以; 用post可以提交的数据量非常大,

  • 本文向大家介绍HTTP GET和POST请求的区别?相关面试题,主要包含被问及HTTP GET和POST请求的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: get参数通过url传递,post放在request body中。 get请求在url中传递的参数是有长度限制的,而post没有。 get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。 get请求只能

  • 本文向大家介绍ajax请求post和get的区别以及get post的选择,包括了ajax请求post和get的区别以及get post的选择的使用技巧和注意事项,需要的朋友参考一下 最简单的区别: 1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来 2.使用Get请求发送数据量小,Post请求发送数据量大 3.get请求需注意缓存问题,post请求不需担心这个问题 Ge

  • 本文向大家介绍请谈一谈,get和post的区别?相关面试题,主要包含被问及请谈一谈,get和post的区别?时的应答技巧和注意事项,需要的朋友参考一下 考察点:HTTP请求   (1)在客户端, Get 方式在通过 URL 提交数据,数据 在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。 (2)GET方式提交的数据最多只能有1024字节,而POST则没有此限制。 (3)安