3个答案 按时间排序 按投票排序
-
贴个listener给你,结合自己的环境试试。
public class UserCounterListener implements ServletContextListener, HttpSessionAttributeListener, HttpSessionListener { /** * Name of user counter variable */ public static final String COUNT_KEY = "userCounter"; /** * Name of users Set in the ServletContext */ public static final String USERS_KEY = "userNames"; /** * The default event we're looking to trap. */ public static final String EVENT_KEY = HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY; private transient ServletContext servletContext; private int counter; private Set<User> users; /** * Initialize the context * * @param sce the event */ public synchronized void contextInitialized(ServletContextEvent sce) { servletContext = sce.getServletContext(); servletContext.setAttribute((COUNT_KEY), Integer.toString(counter)); } /** * Set the servletContext, users and counter to null * * @param event The servletContextEvent */ public synchronized void contextDestroyed(ServletContextEvent event) { servletContext = null; users = null; counter = 0; } synchronized void incrementUserCounter() { counter = Integer.parseInt((String) servletContext.getAttribute(COUNT_KEY)); counter++; servletContext.setAttribute(COUNT_KEY, Integer.toString(counter)); } synchronized void decrementUserCounter() { int counter = Integer.parseInt((String) servletContext.getAttribute(COUNT_KEY)); counter--; if (counter < 0) { counter = 0; } servletContext.setAttribute(COUNT_KEY, Integer.toString(counter)); } @SuppressWarnings("unchecked") synchronized void addUsername(User user) { users = (Set<User>) servletContext.getAttribute(USERS_KEY); if (users == null) { users = new LinkedHashSet<User>(); } if (!users.contains(user)) { users.add(user); servletContext.setAttribute(USERS_KEY, users); incrementUserCounter(); } } @SuppressWarnings("unchecked") synchronized void removeUsername(User user) { users = (Set<User>) servletContext.getAttribute(USERS_KEY); if (users != null) { users.remove(user); } servletContext.setAttribute(USERS_KEY, users); decrementUserCounter(); } /** * This method is designed to catch when user's login and record their name * * @param event the event to process * @see javax.servlet.http.HttpSessionAttributeListener#attributeAdded(javax.servlet.http.HttpSessionBindingEvent) */ public void attributeAdded(HttpSessionBindingEvent event) { if (event.getName().equals(EVENT_KEY) && !isAnonymous()) { SecurityContext securityContext = (SecurityContext) event.getValue(); if (securityContext != null && securityContext.getAuthentication().getPrincipal() instanceof User) { User user = (User) securityContext.getAuthentication().getPrincipal(); addUsername(user); } } } private boolean isAnonymous() { AuthenticationTrustResolver resolver = new AuthenticationTrustResolverImpl(); SecurityContext ctx = SecurityContextHolder.getContext(); if (ctx != null) { Authentication auth = ctx.getAuthentication(); return resolver.isAnonymous(auth); } return true; } /** * When user's logout, remove their name from the hashMap * * @param event the session binding event * @see javax.servlet.http.HttpSessionAttributeListener#attributeRemoved(javax.servlet.http.HttpSessionBindingEvent) */ public void attributeRemoved(HttpSessionBindingEvent event) { if (event.getName().equals(EVENT_KEY) && !isAnonymous()) { SecurityContext securityContext = (SecurityContext) event.getValue(); Authentication auth = securityContext.getAuthentication(); if (auth != null && (auth.getPrincipal() instanceof User)) { User user = (User) auth.getPrincipal(); removeUsername(user); } } } /** * Needed for Acegi Security 1.0, as it adds an anonymous user to the session and * then replaces it after authentication. http://forum.springframework.org/showthread.php?p=63593 * * @param event the session binding event * @see javax.servlet.http.HttpSessionAttributeListener#attributeReplaced(javax.servlet.http.HttpSessionBindingEvent) */ public void attributeReplaced(HttpSessionBindingEvent event) { if (event.getName().equals(EVENT_KEY) && !isAnonymous()) { final SecurityContext securityContext = (SecurityContext) event.getValue(); if (securityContext.getAuthentication() != null && securityContext.getAuthentication().getPrincipal() instanceof User) { final User user = (User) securityContext.getAuthentication().getPrincipal(); addUsername(user); } } } public void sessionCreated(HttpSessionEvent se) { } public void sessionDestroyed(HttpSessionEvent se) { Object obj = se.getSession().getAttribute(EVENT_KEY); if (obj != null) { se.getSession().removeAttribute(EVENT_KEY); } } }
2013年6月05日 15:05
相关推荐
在构建Spring Security项目时,这些jar包构成了基本的依赖集合。如果你的应用只需要基本的认证和授权功能,可能只需要`spring-security-core`和`spring-security-web`两个模块。如果涉及到LDAP认证或者对象级别的...
3. **实现自定义安全元数据源**:重写`AbstractSecurityMetadataSourceService`类并实现`getAttributes(Object object)`方法,该方法根据传入的URL获取相应的权限集合。 4. **集成到Spring Security配置中**:在`...
- **项目模块**:Spring Security 提供了多个模块,每个模块都包含特定的功能集合。 - **Core (spring-security-core.jar)**:核心模块,包含了认证和授权的核心实现。 - **Web (spring-security-web.jar)**:为 ...
Spring也支持Web服务,但CXF提供了更丰富的Web服务功能,如WS-Security等高级特性。 **三、CXF 2.7.5与Spring 3.0集成的优势** 1. **无缝整合**:Spring的DI容器可以管理CXF的bean,简化服务的配置和生命周期管理。...
值得注意的是,Acegi Security在Spring 3.0版本后已被弃用,取而代之的是更为强大和现代化的Spring Security框架。尽管如此,理解Acegi Security对于了解Spring Security的历史和发展,以及掌握早期安全实践仍然具有...
压缩包中的文件包括《Spring技术内幕》、《java_spring_day01》、《Spring2.0核心技术与最佳实践》、《使用注解整合Spring和DWR的笔记》、《spring3.0资料》、《Spring从入门到精通》以及《Spring 2.0 中文用户指南+...
除了上述提到的一些主要组成部分之外,Spring还拥有一个庞大的生态系统,包括一系列的扩展模块和技术,如Spring Security(安全模块)、Spring Data(数据访问模块)、Spring Batch(批处理模块)等。这些模块进一步...
在系统运行过程中,为了实现用户的登录验证、权限控制等功能,"employeesystem3.0"可能会集成Spring Security或Apache Shiro等安全框架。此外,系统还可能引入缓存技术如Redis,提高数据读取速度,减轻数据库压力。 ...
3. 认证授权框架:Spring Security等 计算机基础 1. 计算机网络:TCP/IP、HTTP、Socket等 2. 操作系统:进程管理、内存管理、文件系统等 3. 数据结构:数组、链表、栈、队列等 微服务分布式 1. 微服务分布式架构...
对于学习和研究Spring的开发者,"spring-framework-3.0.5.RELEASE-with-docs.zip"压缩包内的文档将是宝贵的参考资料,包含了详细的API文档、用户指南和示例代码,有助于深入理解Spring的每一个角落。
- **Spring Boot 2.3**(2019年):提供了对 Spring Security 5.2 和 Java 11 的支持。 - **Spring Boot 2.5**(2021年):增加了对 Java 16 的支持,并且提高了与其他技术栈的兼容性。 **2.3 Spring Boot 特征** ...
- **Spring Security Facelets标签库**:为安全控制提供了更丰富的标签支持。 - **Spring JavaScript更新**:增强了JavaScript的支持能力。 - **JSP Portlet支持**:提供了对JSP Portlet的更好支持。 #### 定义流程...
Spring Security 自 3.0 版本开始引入了 Spring Expression Language (SPEL) 来控制系统的访问权限,使得授权逻辑变得更加灵活和强大。SPEL 是一种表达式语言,允许在运行时查询和操作对象,包括在权限控制中使用...
第5章 Spring Security 164 5.1 加强URL访问安全 165 5.1.1 问题 165 5.1.2 解决方案 165 5.1.3 工作原理 166 5.2 登录到Web应用 175 5.2.1 问题 175 5.2.2 解决方案 175 5.2.3 工作原理 175 5.3...
第5章 Spring Security 164 5.1 加强URL访问安全 165 5.1.1 问题 165 5.1.2 解决方案 165 5.1.3 工作原理 166 5.2 登录到Web应用 175 5.2.1 问题 175 5.2.2 解决方案 175 5.2.3 工作原理 175 5.3...
10. **标准和方言**:Thymeleaf支持标准的DOM操作以及第三方扩展的方言,比如SpringSecurity方言,提供了安全相关的便利。 这本手册会详细解释每个概念,并给出实际的例子来帮助理解。如果你正在使用Spring Boot并...