10
respostas

Redirect para o Login quando terminar a Session

Olá boa noite,

Favor, gostaria de ajuda com o seguinte caso...?

Quando terminar a SESSION do usuário por INATIVIDADE, e ele tentar clicar nos links do sistema, como faço para redirecionar ele para a página de login com o spring security ou outra forma.

obrigado,

10 respostas

Opa Fagner, com o Spring Security, se a session tiver expirada, ele vai redirecionar de forma automática. Se vc tiver fazendo na mão, com um filter por exemplo, basta só fazer um if e verificar se o objeto ta na sesssion.

olá Alberto. obrigado mais uma vez pela atenção...

Relamente, o spring security já está fazendo isso de forma automática. Funciona quando o link não é em AJAX.

Mas quando eu uso AJAX, como link, ele está inserindo a página de login.jsp logo abaixo, no fim da página, ou seja, fica o conteúdo do sistema, e logo abaixo o login, tudo na mesma página.

Tem como redirecionar mesmo sendo um Link AJAX?

---chamo a function aqui:

<a id="num_pedido" class="bold blue nome linkPesquisaItem carrega_valor" href="javascript:editarPedido(131)">131</a>

--Link

<c:url value="/pedidos/editarPedido" var="linkPedidosEditar" />

--AJAX

<script type="text/javascript">
function editarPedido(numero_pedido) {
    $('#end-editar-pedido').load(
              "${linkPedidosEditar}", {numero_pedido:numero_pedido},  function() {
                                                      $("#modal-editar-pedido").modal('show');
              }
      );
}
</script>

obrigado,

Provavelmente quando vc tenta fazer uma requisição via ajax e o usuário não está autenticado, o Spring deve retornar 400 como status. Você precisa lidar com esses status e tomar uma ação.

o retorno é 302.

Alberto, o tempo para expirar a sessão por inatividade está automático, pq eu ainda não configurei isso.

Quem está controlando isso.

O tomcat ou o spring security?

como faço para controlar o timeout da session pelo spring security?

obrigado,

Oi Fagner,

O tempo default da sessão é 30min e pode ser configurado no web.xml.

<session-config>
    <session-timeout>10</session-timeout>
</session-config>

Sobre redirecionar para o login quando for clique AJAX, você vai precisar fazer isso no seu client JS. Sempre que receber um 302, fazer window.location = URL. Em geral, você pode procurar pelos listeners de eventos do seu cliente AJAX para capturar esse erro.

Abraço

Oi Fagner, e ai? Conseguiu? Alguma novidade?

olá Paulo, boa noite...

Eu consegui resolver com o código abaixo...não coloquei um listener....

O problema...é que vou ter que colocar isso em cada link...

mas por enquanto....vai esse mesmo...

function editarPedido(numero_pedido) {
    $('#end-editar-pedido').load(
              "${linkPedidosEditar}", {numero_pedido:numero_pedido},
                      function(responseText, textStatus, XMLHttpRequest) {
              var texto = XMLHttpRequest.responseText; 
              if(texto.indexOf("login") >0){
                  location.href="/assistecsoft/login";
              }else {
                       $("#modal-editar-pedido").modal('show');
                    }
              }
      )
};

Outro coisa que estou tentando configurar é o usuário acessar somente uma sessão, ou seja, logar somente uma vez no sistema.

Eu inseri o código abaixo no spring security, mas não funciona...

and().sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true)

obrigado,

Oi Fagner, acho que isso aqui pode te ajudar => https://github.com/spring-projects/spring-boot/issues/1537. Tem uma pessoa com o mesmo problema e rolou uma sugestão de solução.

olá Alberto , bom dia.. O artigo é muito bom.. Mas pena que não funcionou... Quando a session expired, ele não faz o redirect automático...e quando eu click em um link ajax....ele continua inserindo o login no fim da página......

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                            .antMatchers("/carrinhos/**").permitAll()
                            .antMatchers("/resources/**").permitAll()
                            .antMatchers("/expired").permitAll()
                            .anyRequest().authenticated()
                            .and().formLogin().loginPage("/login").permitAll()
                            .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login").permitAll()
                            .and()
                            .sessionManagement()
                                .maximumSessions(1)
                                .maxSessionsPreventsLogin(true)
                                .expiredUrl("/expired")
                                .sessionRegistry(sessionRegistry());

        http.csrf().disable();
    }

     // Work around https://jira.spring.io/browse/SEC-2855
    @Bean
    public SessionRegistry sessionRegistry() {
        SessionRegistry sessionRegistry = new SessionRegistryImpl();
        return sessionRegistry;
    }

    // Register HttpSessionEventPublisher
    @Bean
    public static
    ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
        return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
    }

de qualquer forma, muito obrigado...

Alberto, creio que o negócio ai tenha que ser JS mesmo.

Fagner, como disse... com os Event Handlers você não vai precisar ficar repetindo esse código em todos os Ajax que você fizer. Coloca o código abaixo em um JS que seja carregado em todas as suas páginas que deve resolver:

$( document ).ajaxComplete(function( event, xhr, settings ) {
    if ( settings.url === "SUA_URL_DE_LOGOUT" ) {
        location.href = 'SUA URL';
    }
});

Fonte: https://api.jquery.com/ajaxComplete/