Как создать метод обработки выхода из системы - PullRequest
0 голосов
/ 14 января 2019


Я пытаюсь создать метод для обработки выхода из системы в весенней безопасности.
Также я пытаюсь сделать это without overriding the configure() method в SecurityConfig.


LoginController

    @RequestMapping(value = "/logout")
    public String logoutDo(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession(false);
        SecurityContextHolder.clearContext();
        if (session != null) {
            session.invalidate();
        }
        for (Cookie cookie : request.getCookies()) {
            cookie.setMaxAge(0);
        }
    // update database here
        return "logout";
    }
}

homepage.jsp

     <c:url var="logoutUrl" value="/logout" />
     <a href="${logoutUrl}">Logout</a>

Структура проекта

project structure

Вывод после того, как я нажал на ссылку выхода из системы

error view

Я хочу выяснить, почему метод logoutDo () не выполняется после нажатия logout link.
Есть ли какой-либо процесс выхода из системы по умолчанию, перекрывающий этот процесс?
Пожалуйста помоги. Спасибо.

1 Ответ

0 голосов
/ 14 января 2019

Выход из системы обрабатывается фильтром , и при его вызове завершает цепочку фильтров и возвращает ответ (обычно перенаправление)

Это делается LogoutSuccessHandler

Выдержка из LogoutFilter Spring Security

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    if (requiresLogout(request, response)) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

        if (logger.isDebugEnabled()) {
            logger.debug("Logging out user '" + auth
                    + "' and transferring to logout destination");
        }

        this.handler.logout(request, response, auth);

        logoutSuccessHandler.onLogoutSuccess(request, response, auth);

        return;
    }

    chain.doFilter(request, response);
}

При этом вы всегда можете отключить функцию выхода из Spring Security

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .logout()
                .disable()
        ;
    }

}
...