shiro会话设置

一般选用DefaultWebSessionManager

DefaultWebSessionManager : 用 于 Web 环境的实 现 , 可 以 替 代ServletContainerSessionManager,自己维护着会话,直接废弃了 Servlet 容器的会话管理。

  <!-- 会话ID生成器 -->
    <bean id="sessionIdGenerator"
        class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator" />
    <!-- 会话Cookie模板 关闭浏览器立即失效 -->
    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <constructor-arg value="sid" />
        <property name="httpOnly" value="true" />
        <property name="maxAge" value="-1" />
    </bean>
    <!-- 会话DAO -->
    <bean id="sessionDAO"
        class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
        <property name="sessionIdGenerator" ref="sessionIdGenerator" />
    </bean>
    <!-- 会话验证调度器,每30分钟执行一次验证 ,设定会话超时及保存 -->
    <bean name="sessionValidationScheduler"
        class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
        <property name="interval" value="1800000" />
        <property name="sessionManager" ref="sessionManager" />
    </bean>
    <!-- 会话管理器 -->
     <!-- DefaultWebSessionManager维持自己的会话 -->
    <bean id="sessionManager"
        class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!-- 全局会话超时时间(单位毫秒),默认30分钟 -->
        <property name="globalSessionTimeout" value="1800000" />
        <property name="deleteInvalidSessions" value="true" />
        <property name="sessionValidationSchedulerEnabled" value="true" />
        <property name="sessionValidationScheduler" ref="sessionValidationScheduler" />
        <property name="sessionDAO" ref="sessionDAO" />
        <property name="sessionIdCookieEnabled" value="true" />
        <property name="sessionIdCookie" ref="sessionIdCookie" />
    </bean>
  • sessionIdCookie 是 sessionManager 创建会话 Cookie 的模板
  • sessionIdCookie.name:设置 Cookie 名字,默认为 JSESSIONID;
  • sessionIdCookie.domain:设置 Cookie 的域名,默认空,即当前访问的域名;
  • sessionIdCookie.path:设置 Cookie 的路径,默认空,即存储在域名根下;
  • sessionIdCookie.maxAge:设置 Cookie 的过期时间,秒为单位,默认-1 表示关闭浏览器时过期 Cookie;
  • sessionIdCookie.httpOnly:如果设置为 true,则客户端不会暴露给客户端脚本代码,使用HttpOnly cookie有助于减少某些类型的跨站点脚本攻击;此特性需要实现了Servlet 2.5 MR6及以上版本的规范的 Servlet 容器支持;
  • sessionManager.sessionIdCookieEnabled:是否启用/禁用 Session Id Cookie,默认是启用的,如果禁用后将不会设置 Session Id Cookie,即默认使用了 Servlet 容器的 JSESSIONID,且通过 URL 重写(URL 中的“;JSESSIONID=id”部分)保存 Session Id。另外我们可以如“sessionManager. sessionIdCookie.name=sid”这种方式操作 Cookie 模板.

会话监听器

package com.cxy.sessionListener;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.SessionListener;

/**
 * 会话监听器,监听会话创建、过期及停止事件
 * 只监听某一个事件,可以继承SessionListenerAdapte
 * @author Administrator
 *
 */
public class MySessionListener1 implements SessionListener{
	@Override
	public void onStart(Session session) {//会话创建时触发
		 System.out.println("会话创建:" + session.getId()); 
		
	}
	
	@Override
	public void onExpiration(Session session) {
		//会话过期时触发
		 System.out.println("会话过期:" + session.getId()); 
		 
		
	}

	

	@Override
	public void onStop(Session session) {
		//停止时触发
		System.out.println("会话停止:" + session.getId());
		
	}
	
}
<!-- 会话监听器 -->
     <bean id="listener1" class="com.cxy.sessionListener.MySessionListener1"/> 
    <!-- 会话管理器 -->
     <!-- DefaultWebSessionManager维持自己的会话 -->
    <bean id="sessionManager"
        class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!-- 全局会话超时时间(单位毫秒),默认30分钟 -->
        <property name="globalSessionTimeout" value="1800000" />
        <property name="deleteInvalidSessions" value="true" />
        <property name="sessionValidationSchedulerEnabled" value="true" />
        <property name="sessionValidationScheduler" ref="sessionValidationScheduler" />
        <property name="sessionDAO" ref="sessionDAO" />
        <property name="sessionIdCookieEnabled" value="true" />
        <property name="sessionIdCookie" ref="sessionIdCookie" />
        <property name="sessionListeners" ref="listener1"/>
    </bean>

会话存储/持久化

Shiro 提供 SessionDAO 用于会话的 CRUD

  <!-- 会话DAO -->
    <bean id="sessionDAO"
        class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
        <property name="sessionIdGenerator" ref="sessionIdGenerator" />
    </bean>

会话验证

Shiro 提供了会话验证调度器,用于定期的验证会话是否已过期,如果过期将停止会话;出于性能考虑,一般情况下都是获取会话时来验证会话是否过期并停止会话的;但是如在 web环境中,如果用户不主动退出是不知道会话是否过期的,因此需要定期的检测会话是否过期,Shiro 提供了会话验证调度器 SessionValidationScheduler 来做这件事情。
 

  <!-- 会话验证调度器,每30分钟执行一次验证 ,设定会话超时及保存 -->
    <bean name="sessionValidationScheduler"
        class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
        <property name="interval" value="3600000" />
        <property name="sessionManager" ref="sessionManager" />
        <property name="globalSessionTimeout" value="1800000" />
    </bean>
 <!-- 会话管理器 -->
     <!-- DefaultWebSessionManager维持自己的会话 -->
    <bean id="sessionManager"
        class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!-- 全局会话超时时间(单位毫秒),默认30分钟 -->
        <property name="globalSessionTimeout" value="1800000" />
        <property name="deleteInvalidSessions" value="true" />
        <property name="sessionValidationSchedulerEnabled" value="true" />
        <property name="sessionValidationScheduler" ref="sessionValidationScheduler" />
        <property name="sessionDAO" ref="sessionDAO" />
        <property name="sessionIdCookieEnabled" value="true" />
        <property name="sessionIdCookie" ref="sessionIdCookie" />
        <property name="sessionListeners" ref="listener1"/>
    </bean>

sessionManager 默 认 就是使 用ExecutorServiceSessionValidationScheduler,其使用 JDK 的 ScheduledExecutorService 进行定期调度并验证会话是否过期;

interval:设置调度时间间隔,单位毫秒,默认就是 1 小时;

sessionManager:设置会话验证调度器进行会话验证时的会话管理器;

globalSessionTimeout:设置全局会话超时时间,默认 30 分钟,即如果 30分钟内没有访问会话将过期

sessionManager.sessionValidationSchedulerEnabled:是否开启会话验证器,默认是开启的;

sessionManager.sessionValidationScheduler : 设置会话验证调度器,默认就是ExecutorServiceSessionValidationScheduler。

 使用 Quartz 会话验证调度器

<!-- quartz会话验证调度器-->
    <bean name="quartzValidationScheduler"
        class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationSched
uler ">
        <property name="sessionValidationInterval" value="3600000" />
        <property name="sessionManager" ref="sessionManager" />
  
    </bean>

使用时需要导入 shiro-quartz 依赖:

<dependency> 
 <groupId>org.apache.shiro</groupId> 
 <artifactId>shiro-quartz</artifactId> 
 <version>1.2.2</version> 
</dependency

其他设置

1.如果在会话过期时不想删除过期的会话,会话管理器如下设置,默认是开启的

扫描二维码关注公众号,回复: 5517770 查看本文章

<property name="deleteInvalidSessions" value="false" />

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

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

猜你喜欢

转载自blog.csdn.net/qq_38930240/article/details/86688827