相关 API
Subject.getSession()
:即刻获取会话,等价于Subject.getSession(true)
,即如果当前没有创建Session
对象则会立即创建一个;而Subject.getSession(false)
则是如果当前没有Session
则返回null
。session.getId()
:获取当前会话的唯一标识。session.getHost()
:获取当前会话的主机地址。session.getTimeout()&session.setTimeout(毫秒)
:获取/设置当前Session
的过期时间。session.getStartTimestamp()&session.getLastAccessTime()
:获取会话的启动时间及最后访问时间。如果是 JavaSE 应用需要自己定期调用session.touch()
去更新最后访问时间;如果是 web 应用,每次进入ShiroFilter
都会自动调用session.touch()
来更新最后访问时间。session.touch()&session.stop()
:更新会话最后访问时间及销毁会话。当执行Subject.logout()
时会自动调用session.stop()
方法来销毁会话。如果在 Web 应用程序中,调用HttpSession.invalidate()
也会自动调用 Shiro 的session.stop()
来销毁 Shiro 的会话。session.setAttribute(key,val)&session.getAttribute(key)&session.removeAttribute(key)
:设置/获取/删除会话属性。
Shiro 提供的 Session
有一个特点就是非侵入式,看如下示例:
// com.zze.shiro.web.controller.TestController
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
public class TestController {
@RequestMapping("testSession")
public void test(HttpSession httpSession){
httpSession.setAttribute("key","from HttpSessionValue");
Session shiroSession = SecurityUtils.getSubject().getSession();
Object key = shiroSession.getAttribute("key");
System.out.println(key);
//输出 from HttpSessionValue
}
}
在上面代码中,我们往当前的 HttpSession
实例中存放了一个键值对,接着我们从 Shiro 提供的 Session
中获取到了之前存放在 HttpSession
中的键值对。这个现象说明了我们可以在当前会话中的任意位置获取到 Session
中的数据,例如 Service
中。
会话监听器
会话监听器用于监听会话的创建、过期即停止事件。需要实现 SessionListener
接口:
package org.apache.shiro.session;
public interface SessionListener {
// 会话开始
void onStart(Session session);
// 会话销毁
void onStop(Session session);
// 会话过期
void onExpiration(Session session);
}
使用如下:
1、自定义一个会话监听器类:
// com.zze.shiro.web.listener.ShiroSessionListener
import org.apache.shiro.session.Session;
import org.apache.shiro.session.SessionListener;
public class ShiroSessionListener implements SessionListener {
public void onStart(Session session) {
System.out.println("session 创建");
}
public void onStop(Session session) {
System.out.println("session 销毁");
}
public void onExpiration(Session session) {
System.out.println("session 过期");
}
}
2、在 Spring 核心配置文件中配置会话管理器,注入自定义会话监听器,接着把会话管理器注入给安全管理器:
<!-- 自定义session监听器 -->
<bean id="shiroSessionListener" class="com.zze.shiro.web.listener.ShiroSessionListener"/>
<!-- 会话管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<property name="sessionListeners">
<list>
<ref bean="shiroSessionListener"/>
</list>
</property>
</bean>
<!--
配置安全管理器 SecurityManager
-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="cacheManager" ref="cacheManager"/>
<property name="authenticator" ref="authenticator"/>
<!--配置多 Realm-->
<property name="realms">
<list>
<ref bean="jdbcRealm"/>
<ref bean="secondRealm"/>
</list>
</property>
<property name="sessionManager" ref="sessionManager"/>
</bean>
评论区