Как передать параметр вместе с URL успеха выхода из системы в весенней безопасности?

Я использую конфигурацию безопасности Spring на основе Java в своем приложении для весенней загрузки. Когда пользователь нажимает на ссылку выхода из системы, он перенаправляется на страницу входа. Здесь, в этом случае, мне нужно передать пользовательский параметр в URL успеха выхода из системы.

например, когда я выхожу, приложение перенаправляется на http://localhost:8080/app/login, но я хочу, чтобы у него был параметр, подобный приведенному ниже http://localhost:8080/app/login?idletimeout=true

Я создал свой собственный LogoutSuccesshandle для этого. Я получаю значение параметра в обработчике, а затем создаю URL успеха и затем перенаправляю на него. Но затем при выходе из системы этот параметр пропадает.

Ниже мой код обработчика.

public class LogoutSuccessHandlerImpl extends SimpleUrlLogoutSuccessHandler {

    private final RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {

        request.getSession().invalidate();
        SecurityContextHolder.clearContext();

        request.setAttribute("isLoggedOut", "true");

        String contextPath = request.getContextPath();
        String redirectURL = "/login";

        String isIdleTimeOut = request.getParameter("idleTimeout");
        request.setAttribute("idleTimeout", isIdleTimeOut);

        System.out.println(isIdleTimeOut + " isIdleTimeOut ");

        if (isIdleTimeOut != null && isIdleTimeOut.equalsIgnoreCase("true")) {
            System.out.println("in if ");
            redirectURL += "?idleTimeout=" + isIdleTimeOut;
        }

        // setDefaultTargetUrl(redirectURL);
        // response.sendRedirect(redirectURL);
       // super.onLogoutSuccess(request, response, authentication);
        redirectStrategy.sendRedirect(request, response, redirectURL);
    }

Ниже мой код конфигурации Java.

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
        .and()
            .formLogin()
            .loginPage("/login")
            .loginProcessingUrl("/checkLogin")
            .defaultSuccessUrl("/home")
            .failureUrl("/login?login_error=1")
            .usernameParameter("username")
            .passwordParameter("password")
            .permitAll()
        .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessHandler(new LogoutSuccessHandlerImpl())
            .deleteCookies("JSESSIONID")
            .invalidateHttpSession(true)
            .permitAll()
        .and()
            .authorizeRequests()
            .antMatchers("/login**").permitAll()
            .antMatchers("/error**").permitAll()
            .antMatchers("/checkLogin**").permitAll()
            .anyRequest()
            .authenticated()
            .accessDecisionManager(accessDecisionManager)
        .and()
            .exceptionHandling()
            .accessDeniedPage("/accessDenied")
        .and()
            .headers()
            .frameOptions()
            .disable()
        .and()
            .sessionManagement()
            .invalidSessionUrl("/login")
            .maximumSessions(1);
    }

2 ответа

Что вы можете сделать, это подготовить свой собственный метод выхода из системы (пользовательский URL-адрес выхода) для вашего приложения:

1) Подготовьте свой LogoutController:

@Controller
@RequestMapping(value = "/logout")
public class LogoutController {

    @RequestMapping(value = {"", "/"})
    public String logout(HttpServletRequest request) {
        SecurityContextHolder.clearContext();
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
        return "redirect:" + <your-logout-success-url>;
    }

}

Здесь, аннулирование сеанса и очистка контекста предоставляет вам механизм выхода из системы.

2) Обновите ваши URL для выхода из системы внутри jsp файлов:

<a href="/logout" id="logout_" title="Log out"><span>Log out</span></a>

3) Кроме того, для сценариев выхода из системы по умолчанию вы все равно можете продолжать использовать выход из системы Spring Security:

<logout logout-success-url="/" invalidate-session="true" delete-cookies="JSESSIONID"
            logout-url="/j_spring_security_logout"/>

Таким образом, в этом методе выхода из системы вы можете делать все, что захотите, с объектом запроса, когда пользователь запрашивает процесс выхода из системы. Вам не нужно передавать параметры сейчас.

Должно быть как то так

http
      .logout()
          .logoutRequestMatcher(new AntPathRequestMatcher("/login?idletimeout=true"));

В XML

<logout invalidate-session="true" logout-success-url="/login?idletimeout=true"/>
Другие вопросы по тегам