【问题标题】:Why am I not getting redirected to logoutSuccessUrl?为什么我没有被重定向到 logoutSuccessUrl?
【发布时间】:2022-01-05 19:16:32
【问题描述】:

这让我很头疼。我发现的只是如何禁用重定向。 我正在尝试做相反的事情,但似乎无法弄清楚如何!

我想要实现的是:在成功注销后,将用户重定向到另一个页面(无论是登录页面还是注销成功页面)。

发生的情况是:成功注销后,我仍停留在同一页面上,即使我可以在开发人员工具的网络选项卡下看到正确的响应。

这是我目前拥有的:

安全配置:

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .csrf(c -> c.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
                .oauth2Login()
                    .loginPage("/login").permitAll()
                    .and()
                .logout()
                    .logoutSuccessUrl("/logged-out").permitAll()
                    .invalidateHttpSession(true)
                    .deleteCookies("JSESSIONID");
    }

控制器方法:

    @GetMapping("logged-out")
    public ModelAndView loggedOut(ModelMap model) {
        return new ModelAndView("logged-out", model);
    }

连接到按钮的js脚本:

let logout = function() {
    let request = new XMLHttpRequest();
    request.open("POST", "/logout");
    request.setRequestHeader("X-XSRF-TOKEN", Cookies.get('XSRF-TOKEN'));
    request.setRequestHeader("Accept", "text/html");
    request.send();
}

点击按钮后的日志事件:

DEBUG 15539 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet        : GET "/logged-out", parameters={}
DEBUG 15539 --- [nio-8080-exec-9] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.hamargyuri.petprojectjava2021.controller.HomeController#loggedOut(ModelMap)
DEBUG 15539 --- [nio-8080-exec-9] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html]
DEBUG 15539 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet        : Completed 200 OK

and here's what I see in the browser

我敢肯定,我在这里错过了一些非常愚蠢的事情,但我正处于撞墙的阶段,所以我很感激任何指导!

【问题讨论】:

  • 根据您的屏幕截图,它似乎运行良好! ;) 不幸的是,您的 javascript 客户端正在将响应丢弃在地板上。我认为您依赖于来自 javascript 客户端的重定向,AFAIK 实际上并没有触发您的浏览器来呈现页面。相反,您应该在服务器上为您的 javascript 客户端生成有意义的响应,并将响应处理构建到客户端中。
  • @SteveRiesenberg 谢谢,我现在明白了!我必须让前端对成功的注销调用采取行动。太好了,它现在可以工作了:)
  • 耶!很高兴我能帮上忙。这些天我很少能帮助解决 UI 问题,但我得到了这个!

标签: spring-security spring-security-oauth2


【解决方案1】:

所以,我的前端代码似乎有问题,因为如果注销调用成功,它应该做一些事情。 我知道这是非常基本的,但这是我在 js 中所做的更改:

let goHome = function() {
    window.location.href = "/";
}

let logout = function() {
    let request = new XMLHttpRequest();
    request.open("POST", "/logout");
    request.setRequestHeader("X-XSRF-TOKEN", Cookies.get('XSRF-TOKEN'));
    request.onload = goHome;
    request.send();
}

我也去掉了显式的logoutSuccessUrl,默认就可以了,只要我需要一个成功响应,那么上面的函数就会带我“回家”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多