shiro会话管理示例代码

2019-01-16 23:11:36王旭

Java代码  

//分页获取会话并验证 String sql = "select session from sessions limit ?,?"; int start = 0; //起始记录 int size = 20; //每页大小 List<String> sessionList = jdbcTemplate.queryForList(sql, String.class, start, size); while(sessionList.size() > 0) { for(String sessionStr : sessionList) { try { Session session = SerializableUtils.deserialize(sessionStr); Method validateMethod = ReflectionUtils.findMethod(AbstractValidatingSessionManager.class, "validate", Session.class, SessionKey.class); validateMethod.setAccessible(true); ReflectionUtils.invokeMethod(validateMethod, sessionManager, session, new DefaultSessionKey(session.getId())); } catch (Exception e) { //ignore } } start = start + size; sessionList = jdbcTemplate.queryForList(sql, String.class, start, size); }

其直接改造自ExecutorServiceSessionValidationScheduler,如上代码是验证的核心代码,可以根据自己的需求改造此验证调度器器;ini的配置和之前的类似。

如果在会话过期时不想删除过期的会话,可以通过如下ini配置进行设置:

Java代码  

sessionManager.deleteInvalidSessions=false

默认是开启的,在会话过期后会调用SessionDAO的delete方法删除会话:如会话时持久化存储的,可以调用此方法进行删除。 

如果是在获取会话时验证了会话已过期,将抛出InvalidSessionException;因此需要捕获这个异常并跳转到相应的页面告诉用户会话已过期,让其重新登录,如可以在web.xml配置相应的错误页面:

Java代码  

<error-page> <exception-type>org.apache.shiro.session.InvalidSessionException</exception-type> <location>/invalidSession.jsp</location> </error-page>

sessionFactory

sessionFactory是创建会话的工厂,根据相应的Subject上下文信息来创建会话;默认提供了SimpleSessionFactory用来创建SimpleSession会话。

首先自定义一个Session:

Java代码  

public class OnlineSession extends SimpleSession { public static enum OnlineStatus { on_line("在线"), hidden("隐身"), force_logout("强制退出"); private final String info; private OnlineStatus(String info) { this.info = info; } public String getInfo() { return info; } } private String userAgent; //用户浏览器类型 private OnlineStatus status = OnlineStatus.on_line; //在线状态 private String systemHost; //用户登录时系统IP //省略其他 }

OnlineSession用于保存当前登录用户的在线状态,支持如离线等状态的控制。

接着自定义SessionFactory:

Java代码