`
mnieguomin
  • 浏览: 26393 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring Security---ConcurrentSessionFilter

 
阅读更多

                                 ConcurrentSessionFilter(转)

ConcurrentSessionFilter做的功能比较简单,主要是判断session是否过期以及更新最新访问时间

     通过代码HttpSession session = request.getSession(false);判断获取session

1、首先判断session是否存在--------HttpSession session = request.getSession(false)

    如果session不存在,直接放过,执行下一个过滤器。

   如果存在,则执行第二步

2、根据sessionid从sessionRegistry中获取SessionInformation,从SessionInformation中获取session是否过期

    如果没有过期,则更新SessionInformation的访问日期。

    如果过期,则执行doLogout()方法,这个方法会将session无效,并将SecurityContext中的Authentication中的权限置空,同时在SecurityContenxtHoloder中清除SecurityContext

    然后查看是否有跳转的URL,如果有就跳转,没有就输出提示信息

在ConcurrentSessionFilter有两个重要的类需要知道,一个是sessionRegistry(默认使用sessionRegistryImpl),一个是SessionInformation 。

sessionRegistry顾名思义 session注册表,有维护两个类变量ConcurrentMap<Object,Set<String>> principals 和Map<String, SessionInformation> sessionIds

principals以用户认证信息为key,values值sessionId集合,sessionIds以sessionId为key,以SessionInformation 为values值。

sessionInformation只要存放4个参数,一个是lastRequest;(最近访问时间),一个是sessionId,一个是principal(用户认证权限),一个是expired (是否过期)

这两个类变量的信息会在后面的登陆认证的时候进行赋值

 

代码如下

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        if (session != null) {
            SessionInformation info = sessionRegistry.getSessionInformation(session.getId());
            if (info != null) {
                if (info.isExpired()) {
                    // Expired - abort processing
                    doLogout(request, response);
                    String targetUrl = determineExpiredUrl(request, info);
                    if (targetUrl != null) {
                        redirectStrategy.sendRedirect(request, response, targetUrl);
                        return;
                    } else {
                        response.getWriter().print("This session has been expired (possibly due to multiple concurrent " +
                                "logins being attempted as the same user).");
                        response.flushBuffer();
                    }
                    return;
                } else {
                    // Non-expired - update last request date/time
                    sessionRegistry.refreshLastRequest(info.getSessionId());
                }
            }
        }
        chain.doFilter(request, response);
    }

分享到:
评论

相关推荐

    spring-security3.1源码

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。Spring Security 3.1 版本是该框架的一个重要里程碑,它提供了许多关键的安全特性,包括身份验证、授权、会话管理以及对Web...

    SpringSecurity安全框架基础Demo

    这个"SpringSecurity安全框架基础Demo"旨在帮助开发者快速理解和实践Spring Security的核心功能。 **1. 用户认证** 在Spring Security中,用户认证主要由Authentication对象负责。当用户尝试访问受保护的资源时,...

    springSecurity3例子

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它为Web应用程序提供了全面的身份验证、授权和访问控制功能。在Spring Security 3版本中,这个框架进一步完善了其特性和性能,使其成为开发者...

    spring security简单示例

    Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本示例中,我们将探讨如何使用Spring Security为简单的Web应用程序添加安全功能。首先,让我们了解一下Spring ...

    springsecurity源码(鉴权有缺陷)

    核心组件是`DelegatingFilterProxy`,它是一个Servlet过滤器,用于代理其他Spring Bean(如`SecurityContextPersistenceFilter`和`ConcurrentSessionFilter`)。 2. **鉴权流程**: - **身份验证(Authentication...

    Spring security 4.0

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。在4.0版本中,它提供了一套全面的安全解决方案,包括身份验证、授权、会话管理以及跨站请求伪造(CSRF)防护。这个版本是...

    Spring Security

    5. **Namespace Configuration**: 提供的`springsecurity-namespace`文件是为了简化Spring Security的配置。通过XML配置,开发者可以声明式地设置安全规则,如定义访问控制、定义过滤器链等。 **配置与使用** ...

    Spring Security实现禁止用户重复登陆的配置原理

    &lt;bean id="concurrencyFilter" class="org.springframework.security.web.session.ConcurrentSessionFilter"&gt; &lt;constructor-arg name="sessionRegistry" ref="sessionRegistry" /&gt; &lt;constructor-arg name=...

    spring-security:Spring安全测试项目

    3. 滤器链:Spring Security的核心是其滤器链,包括`DelegatingFilterProxy`、`SecurityContextPersistenceFilter`、`ConcurrentSessionFilter`等。这些滤器协同工作,处理从请求到响应的整个生命周期。通过调整滤器...

    Spring Security二

    **Spring Security 源码分析** Spring Security 是一个强大的、高度可定制的访问控制和身份认证框架,广泛应用于Java EE应用程序的安全管理。它为开发者提供了丰富的功能,包括身份验证、授权、会话管理以及CSRF...

    Spring Security如何在Servlet中执行

    Spring Security 是一个强大的安全框架,专门用于处理Java应用的安全需求,包括认证和授权。在Servlet环境中,Spring Security通过集成到Servlet的过滤器链(Servlet Filter Chain)中来实现在Web应用中的安全控制。...

    全面解析Spring Security 内置 Filter

    Spring Security 内置 Filter 综述 Spring Security 作为一个流行的 Java 安全框架,提供了丰富的安全功能,其中内置的 Filter 机制是其核心之一。通过这些内置的 Filter,我们可以轻松地实现身份验证、授权、会话...

Global site tag (gtag.js) - Google Analytics