2015-03-31 70 views
0

1我遇到问题。我在我的项目用户,管理员,专家中担任3个角色。 2 3不同的用户登录页面。 3我想要的是当会话过期时,以及之后,如果用户做了任何事件,页面应根据那里的角色指示。 例如,用户应该重定向到用户登录和管理员来管理登录。在会话过期后重定向到登录页面

我已经阅读了很多关于它的文档。有一些给出了添加过​​滤器和检查过滤器中的会话的想法。 但是这个问题是我没有得到过滤器的作用。' 所以SpringSecurityHolder将在Filter中工作。

我也读过有关采用事件的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{ 

      } 

     } 

    } 

} 

请帮我我如何将能够重定向页面内直接。

感谢您的帮助

+0

所以我删除了我的答案,并且据我所知和理解,它不会,因为你在你身边的代码正在获取身份验证,这是不存在的,因为用户已经注销。请阅读一些基础知识,它们会有所帮助。 – 2015-03-31 12:24:29

+0

但你认为必须有一些功能,我们可以从中决定在哪里重定向页面 – 2015-03-31 12:34:56

回答

3

真的是没有确定用户是什么样的作用在一次HTTP会话过期,因为一旦到期的用户信息都丢失了一个好办法。

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

我可以给你的最佳解决方案是设置一个cookie,指出用户所处的角色。该cookie将超过会话,然后您可以根据cookie执行重定向到适当的登录页面。

当然,如果多个不同类型的用户正在使用同一台计算机,因为它们共享相同的Cookie,则会失败。

+0

我的方式我想通过编写基于控制器的异常处理程序和重定向,如果它得到该会话异常。 – 2015-04-01 06:40:21

+0

会话到期发生在后台,因此没有引用HttpServletResponse来发送重定向。 – 2015-04-01 12:40:47

+0

我在会话中保存Session.e.g UserName中的一些值。 所以,如果用户不会做超过10分钟的活动。会话将超时。所以用户名值也将被销毁。所以我可以检查我的控制器。 你不觉得它会起作用。 我的控制器映射与不同的用户不同。对于管理员,它使用/ admin /映射。 放一些灯。 – 2015-04-02 06:24:09

相关问题