【问题标题】:How to manage session timeout expired如何管理会话超时过期
【发布时间】:2017-04-01 07:19:43
【问题描述】:

我有以下问题。我的spring应用配置如下:

应用程序上下文安全

<http use-expressions="true" pattern="/ext/**" entry-point-ref="loginUrlAuthenticationEntryPoint">

    //Others configuration

    <session-management invalid-session-url="/sessionExpired">
    </session-management>
</http>

我的控制器:

@RequestMapping(value="/sessionExpired", method = RequestMethod.GET)
public String sessionExpired(ModelMap model, HttpSession session) {
    return "login";
}

现在我的问题是,在 sessionExpired 方法中,我应该能够区分我的用户的某些属性,例如:

  @RequestMapping(value="/sessionExpired", method = RequestMethod.GET)
public String sessionExpired(ModelMap model, HttpSession session) {

     //Test1
     Authentication auth = SecurityContextHolder.getContext().getAuthentication();
     MyUser u = (MyUser) authentication.getPrincipal();

     //Test2 
     MyUser u = session.getAttribute("user");

     if(u.isItalian())
        return "loginA"
    else 
        return "loginB"

    return "login";
}

我认为 sping security 已经清除了 session、request 和 SecurityContextHolder。那我该如何解决这种情况呢?

【问题讨论】:

标签: java spring spring-security


【解决方案1】:

SessionExpired 表示没有 Session,因为它已经过期了。 一个选项是在事件被销毁之前捕获 Session。 幸运的是,我为您找到了这个解决方案/方法:

http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSessionListener.html

可能是这样的:

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionCounterListener implements HttpSessionListener {

  private static int totalActiveSessions;

  public static int getTotalActiveSession(){
    return totalActiveSessions;
  }

  @Override
  public void sessionCreated(HttpSessionEvent arg0) {
    totalActiveSessions++;
    System.out.println("sessionCreated - add one session into counter");
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent arg0) {
    totalActiveSessions--;
    System.out.println("sessionDestroyed - deduct one session from counter");
  }
}

【讨论】:

  • 好的,我正在尝试这个解决方案,但我的问题是如何到达控制器?
  • 也许你可以把它和webListener结合起来?
  • 好吧,在环顾四周并尝试了一些编码之后,您似乎无权访问该请求。所以你不能将任何人重定向到任何地方。这确实是一个难题。到目前为止最好的方法是将 sessionId 存储为 cookie 并与每个 request 一起发送。当会话过期时,您使用 sessionId 作为参数从数据库中获取用户数据。然后您可以将此user.isItalian() 重定向到特殊页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 2019-08-06
  • 1970-01-01
  • 2011-01-18
  • 2011-11-18
  • 2018-12-14
相关资源
最近更新 更多