Shiro-09-Session Management 会话管理

会话管理

Apache Shiro在 安全性框架世界中提供了一些独特的功能:适用于任何应用程序的完整的企业级Session解决方案,从最简单的命令行和智能手机应用程序到最大的群集企业Web应用程序。

这对许多应用程序都有很大的影响-在Shiro之前,如果需要会话支持,则需要将应用程序部署在Web容器中或使用EJB状态会话Bean。

Shiro的Session支持比这两种机制中的任何一种都更易于使用和管理,并且在任何应用程序中都可以使用,而不论其容器如何。

即使将应用程序部署在Servlet或EJB容器中,仍然有令人信服的理由使用Shiro的Session支持而不是容器的支持。

下面列出了Shiro的会话支持提供的最理想的功能:

特征

  • 基于POJO / J2SE(对IoC友好)

Shiro中的所有内容(包括会话和会话管理的所有方面)都是基于接口的,并使用POJO来实现。

这使您可以轻松地使用与JavaBeans兼容的任何配置格式来配置所有会话组件,例如JSON,YAML,Spring XML或类似机制。

您还可以轻松扩展Shiro的组件或根据需要编写自己的组件,以完全自定义会话管理功能。

  • 轻松自定义会话存储

由于Shiro的会话对象基于POJO,因此会话数据可以轻松存储在任意数量的数据源中。

这使您可以精确地自定义应用程序的会话数据所在的位置,例如文件系统,内存,网络分布式缓存,关系数据库或专有数据存储中的文件系统。

  • 独立于容器的集群!

使用任何易于使用的网络缓存产品(例如Ehcache + Terracotta,Coherence,GigaSpaces等),可以轻松地对Shiro的会话进行集群。

等这意味着您只能为Shiro配置一次会话群集,并且无论部署到哪个容器,您的会话都将以相同的方式群集。无需特定于容器的配置!

  • 异构客户端访问

与EJB或Web会话不同,Shiro会话可以在各种客户端技术之间“共享”。

例如,桌面应用程序可以“查看”和“共享” Web应用程序中同一用户使用的同一物理会话。除了Shiro之外,我们没有其他可以支持此功能的框架。

  • 事件监听器

通过事件监听器,您可以监听会话生命周期中的生命周期事件。您可以侦听这些事件并对它们做出反应,以实现自定义应用程序的行为-例如,在其会话期满时更新用户记录。

  • 主机地址保留

Shiro会话保留从其发起会话的主机的IP地址或主机名。这使您可以确定用户所在的位置并做出相应的反应(在IP关联是确定性的Intranet环境中通常很有用)。

  • 不活动/到期支持

会话由于不活动而到期,如预期的那样,但是可以通过touch()方法延长会话的时间,以保持其“活动”状态。这在Rich Internet Application(RIA)环境中非常有用,在该环境中,用户可能正在使用桌面应用程序,但可能不会与服务器定期进行通信,但是服务器会话不应过期。

  • 透明的 Web 使用

Shiro的网络支持完全实现并支持Session的Servlet 2.5规范(HttpSession接口及其所有关联的API)。这意味着您可以在现有的网络应用程序中使用Shiro会话,而无需更改任何现有的网络代码。

  • 可以用于SSO

由于Shiro会话基于POJO,因此可以轻松存储在任何数据源中,并且可以根据需要在应用程序之间“共享”它们。

我们将其称为“穷人SSO”,由于共享会话可以保留身份验证状态,因此可以用于提供简单的登录体验。

使用会话

与Shiro中的几乎所有其他内容一样,您可以通过与当前正在执行的Subject进行交互来获取Session:

主题currentUser = SecurityUtils.getSubject();

Subject currentUser = SecurityUtils.getSubject();

Session session = currentUser.getSession();
session.setAttribute( "someKey", someValue);

对于熟悉HttpServletRequest API的用户,Subject.getSession(boolean create)方法的功能与HttpServletRequest.getSession(boolean create)方法相同:

  • 如果Subject已经有一个Session,则布尔参数将被忽略,并立即返回Session

  • 如果主题还没有会话,并且create boolean参数为true,则将创建并返回一个新会话。

  • 如果主题还没有会话,并且create boolean参数为false,则不会创建新的会话,并且返回null。

getSession调用可以在任何应用程序中使用,甚至可以在非Web应用程序中使用。

在开发框架代码时可以使用subject.getSession(false)取得良好效果,以确保不必要地创建Session。

获取主题的会话后,您可以使用它进行很多操作,例如设置或检索属性,设置其超时等等。请参阅会话JavaDoc,以查看单个会话可以执行的操作。

会话管理器

顾名思义,SessionManager可以管理应用程序中所有主题的会话-创建,删除,不活动和验证等。

与Shiro中的其他核心体系结构组件一样,SessionManager是SecurityManager维护的顶级组件。

默认的SecurityManager实现默认使用开箱即用的DefaultSessionManager。

DefaultSessionManager实现提供了应用程序所需的所有企业级会话管理功能,例如会话验证,孤立清除等。可以在任何应用程序中使用。

  • 网络应用

Web应用程序使用不同的SessionManager实现。请参阅Web文档以获取特定于Web的会话管理信息。

与由SecurityManager管理的所有其他组件一样,可以在Shiro的所有默认SecurityManager实现(getSessionManager()/ setSessionManager())上通过JavaBeans风格的gettersetter方法获取或设置SessionManager。

或者例如,如果使用shiro.ini配置:

在shiro.ini中配置新的SessionManager

[main]
...
sessionManager = com.foo.my.SessionManagerImplementation
securityManager.sessionManager = $sessionManager

但是从头开始创建SessionManager是一项复杂的任务,而不是大多数人希望自己做的事情。

Shiro的现成SessionManager实施具有高度可定制性和可配置性,将满足大多数需求。

本文档的其余大部分内容都假定您在涵盖配置选项时将使用Shiro的默认SessionManager实现,但是请注意,您基本上可以创建或插入几乎任何您想要的东西。

Shiro-09-Session Management 会话管理_第1张图片

你可能感兴趣的:(web,安全,哈希算法,密码学,算法,java,安全)