在Spring会话过期后重定向到登录页面

在Spring会话过期后重定向到登录页面,spring,spring-mvc,spring-security,Spring,Spring Mvc,Spring Security,我面临一个问题。我有3个角色在我的项目用户,管理员,专家。 2 3不同用户的不同登录页面。 3我想要的是会话何时过期,之后如果用户做了任何事件,页面应该根据那里的角色进行引导。 e、 g用户应重定向到用户登录,管理员应重定向到管理员登录 我已经阅读了很多关于它的文档。一些人提出了添加过滤器的想法,并在过滤器中检查会话。 但问题是,我没有得到过滤器的角色 SpringSecurityHolder也将在过滤器内部工作 我还阅读了有关ApplicationListerner的文章,该文章介绍了这一事件

我面临一个问题。我有3个角色在我的项目用户,管理员,专家。 2 3不同用户的不同登录页面。 3我想要的是会话何时过期,之后如果用户做了任何事件,页面应该根据那里的角色进行引导。 e、 g用户应重定向到用户登录,管理员应重定向到管理员登录

我已经阅读了很多关于它的文档。一些人提出了添加过滤器的想法,并在过滤器中检查会话。 但问题是,我没有得到过滤器的角色 SpringSecurityHolder也将在过滤器内部工作

我还阅读了有关ApplicationListerner的文章,该文章介绍了这一事件。 我已经返回了代码,但是我不知道如何从listerner类内部进行指导

import java.util.List;

import org.springframework.context.ApplicationListener;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.session.HttpSessionDestroyedEvent;

public class SessionTimeoutHandler  implements ApplicationListener<HttpSessionDestroyedEvent>{

    @Override
    public void onApplicationEvent(HttpSessionDestroyedEvent event) {

        List<SecurityContext> lstSecurityContext = event
                .getSecurityContexts();

        for (SecurityContext securityContext : lstSecurityContext)
        {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

            List<GrantedAuthority> authList = (List<GrantedAuthority>) authentication
                    .getAuthorities();
            String userRole = authList.get(0).getAuthority();

            if(userRole.equals("ROLE_ADMIN")){


            }else if(userRole.equals("ROLE_EXPERT")){

            }else{

            }

        }

    }

}
import java.util.List;
导入org.springframework.context.ApplicationListener;
导入org.springframework.security.core.Authentication;
导入org.springframework.security.core.GrantedAuthority;
导入org.springframework.security.core.context.SecurityContext;
导入org.springframework.security.core.context.SecurityContextHolder;
导入org.springframework.security.web.session.HttpSessionDestroyedEvent;
公共类SessionTimeoutHandler实现ApplicationListener{
@凌驾
ApplicationEvent上的公共无效(HttpSessionDestroyeEvent事件){
列表lstSecurityContext=事件
.getSecurityContext();
用于(SecurityContext SecurityContext:lstSecurityContext)
{
身份验证=SecurityContextHolder.getContext().getAuthentication();
列表authList=(列表)身份验证
.getAuthorities();
字符串userRole=authList.get(0.getAuthority();
if(userRole.equals(“ROLE_ADMIN”)){
}else if(userRole.equals(“ROLE\u EXPERT”)){
}否则{
}
}
}
}
请帮助我,我将如何能够重定向页面


感谢您的帮助

在HTTP会话过期后,确实没有一个好的方法来确定用户所扮演的角色,因为一旦该会话过期,用户信息就会消失

您无法从ApplicationListener执行重定向,因为当用户浏览器未发出请求时,会话可能会过期(除非连接打开,否则我们无法将信息推送到浏览器)

我能给你的最佳解决方案是设置一个cookie来指示用户所扮演的角色。cookie将比会话更有效,然后您可以根据cookie重定向到相应的登录页面


当然,如果多个不同类型的用户使用同一台计算机,因为他们共享相同的cookie,那么这将失败。

HTTP会话过期后,确实没有好的方法来确定用户的角色,因为一旦过期,用户信息就消失了

您无法从ApplicationListener执行重定向,因为当用户浏览器未发出请求时,会话可能会过期(除非连接打开,否则我们无法将信息推送到浏览器)

我能给你的最佳解决方案是设置一个cookie来指示用户所扮演的角色。cookie将比会话更有效,然后您可以根据cookie重定向到相应的登录页面


当然,如果多个不同类型的用户使用同一台计算机,因为他们共享相同的cookie,那么这将失败。

HTTP会话过期后,确实没有好的方法来确定用户的角色,因为一旦过期,用户信息就消失了

您无法从ApplicationListener执行重定向,因为当用户浏览器未发出请求时,会话可能会过期(除非连接打开,否则我们无法将信息推送到浏览器)

我能给你的最佳解决方案是设置一个cookie来指示用户所扮演的角色。cookie将比会话更有效,然后您可以根据cookie重定向到相应的登录页面


当然,如果多个不同类型的用户使用同一台计算机,因为他们共享相同的cookie,那么这将失败。

HTTP会话过期后,确实没有好的方法来确定用户的角色,因为一旦过期,用户信息就消失了

您无法从ApplicationListener执行重定向,因为当用户浏览器未发出请求时,会话可能会过期(除非连接打开,否则我们无法将信息推送到浏览器)

我能给你的最佳解决方案是设置一个cookie来指示用户所扮演的角色。cookie将比会话更有效,然后您可以根据cookie重定向到相应的登录页面


当然,如果多个不同类型的用户使用同一台计算机,因为他们共享相同的cookie,则此操作将失败。

因此,我删除了我的答案,据我所知和理解,答案是不会的,因为您的代码正在获得身份验证,而在用户注销时,身份验证并不存在。请阅读一些基础知识,它们会很有帮助。但是你认为一定有一些功能,我们可以从中决定将页面重定向到哪里,所以我删除了我的答案,据我所知和理解,它不会,因为你在你的代码中正在获得身份验证,而在用户注销时,身份验证并不存在。请阅读一些基础知识,它们会很有帮助。但是你认为一定有一些功能,我们可以从中决定将页面重定向到哪里,所以我删除了我的答案,据我所知和理解,它不会,因为你在你的代码中正在获得身份验证,而在用户注销时,身份验证并不存在。请阅读一些基础知识,它们会很有帮助。但是你认为一定有一些功能,我们可以从中决定将页面重定向到哪里,所以我删除了我的答案,据我所知和理解,它不会,因为你在你的代码中得到的验证不是