shiro 单一登录 session
时间: 2023-08-03 11:55:36 浏览: 41
Shiro提供了一种称为“单点登录(SSO)”的机制,它允许用户在一次登录后访问多个应用程序而无需再次输入凭据。 Shiro使用一个称为“会话管理器”的组件来管理会话。默认情况下,Shiro使用Java Servlet规范中定义的HTTP会话管理器来管理会话。 这意味着Shiro会在HTTP会话中存储用户的身份验证凭据和其他相关信息。 在使用单点登录时,Shiro需要确保在多个应用程序之间共享会话信息。 为此,Shiro提供了一种称为“集中式会话管理”的机制,它允许多个应用程序共享同一个会话。 这可以通过将会话信息存储在外部存储库(如数据库或缓存)中来实现。 这样,在用户通过一个应用程序进行身份验证后,其他应用程序可以从共享存储库中检索相同的会话信息,从而实现单点登录。
相关问题
给我一些shiro单一登录的代码
好的,以下是一个使用Shiro实现单一登录的示例代码:
1. 配置Shiro的ini文件,添加如下配置:
```ini
[main]
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 1800000
securityManager.sessionManager.sessionValidationSchedulerEnabled = true
securityManager.sessionManager.sessionDAO = $sessionDAO
securityManager.cacheManager = $cacheManager
```
2. 创建一个自定义的SessionDAO,用于存储Session信息:
```java
public class MySessionDAO extends EnterpriseCacheSessionDAO {
public MySessionDAO(CacheManager cacheManager) {
super();
setCacheManager(cacheManager);
setCacheName("shiro-activeSessionCache");
}
}
```
3. 创建一个自定义的SessionListener,用于监听Session的创建、过期、删除等事件:
```java
public class MySessionListener implements SessionListener {
@Override
public void onStart(Session session) {
// Session创建时的操作
}
@Override
public void onStop(Session session) {
// Session停止时的操作
}
@Override
public void onExpiration(Session session) {
// Session过期时的操作
}
}
```
4. 在Web应用程序中配置ShiroFilter,添加如下代码:
```java
public class ShiroFilter extends AbstractShiroFilter {
@Override
protected void doFilterInternal(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String sessionId = request.getRequestedSessionId();
if (sessionId != null) {
Session session = getSession(sessionId);
if (session == null) {
response.sendRedirect("/login");
} else {
filterChain.doFilter(request, response);
}
} else {
filterChain.doFilter(request, response);
}
}
private Session getSession(String sessionId) {
try {
return SecurityUtils.getSecurityManager().getSession(new DefaultSessionKey(sessionId));
} catch (UnknownSessionException e) {
return null;
}
}
}
```
5. 在应用程序中注册SessionListener:
```java
MySessionListener listener = new MySessionListener();
SecurityUtils.getSubject().getSession().addListener(listener);
```
这些代码可以帮助你实现使用Shiro的单一登录功能。需要注意的是,这只是一个示例,你需要根据自己的实际情况进行相应的修改和调整。
shiro-redis session共享
Shiro-Redis 是一个用于在 Shiro 中实现 Session 共享的插件,它使用 Redis 作为数据存储和缓存,以实现分布式环境下的 Session 共享。
要实现 Shiro-Redis 的 Session 共享,你需要进行以下步骤:
1. 引入 Shiro-Redis 插件依赖:在项目的 Maven 或 Gradle 配置文件中添加 Shiro-Redis 依赖。
2. 配置 Redis 连接信息:在项目的配置文件中配置 Redis 的连接信息,包括主机名、端口号、密码等。
3. 配置 RedisSessionDAO:在 Shiro 的配置文件中配置 RedisSessionDAO,指定使用 Redis 作为 Session 存储和缓存的实现。可以设置过期时间、前缀等参数。
4. 配置 Session Manager:在 Shiro 的配置文件中配置 Session Manager,指定使用自定义的 RedisSessionManager 作为 Session 的管理器。同时,需要将之前配置的 RedisSessionDAO 设置给 RedisSessionManager。
5. 配置 SecurityManager:在 Shiro 的配置文件中配置 SecurityManager,指定使用自定义的 RedisSessionManager 作为 Session 管理器。同时,需要将之前配置的 RedisSessionDAO 设置给 RedisSessionManager。
6. 配置 Filter Chain:在 Shiro 的配置文件中配置 Filter Chain,将自定义的 RedisSessionManager 添加到 Filter Chain 中,以便对请求进行 Session 管理。
通过以上步骤配置完成后,Shiro 将会使用 Redis 进行 Session 的存储和缓存,从而实现 Session 的共享。在分布式环境中,不同应用节点之间可以通过 Redis 共享 Session 数据,从而实现用户的登录状态和会话信息的共享。