既然要做,就做的细致一点,对得起自己!
在shiro中配置session,普通思想:配置session的过期时间,session到期之后,要求用户再次发起登录请求。进阶思想:如果用户一直不关闭浏览器,或者过早的关闭了浏览器,那么就要相应的更新session时间和定期清理这些过期session。高级思想:在分布式系统中,如何在多个系统之间做到session的同步。目前最后一步还没有配置。
1.综上所述,应该有这么几个东西需要配置。定期检查session是否过期的验证器;要对所有session进行管理,需要给session排序,那么需要一个sessionID生成器;同时将sessionID存储在cookie中,以便下次访问服务端根据进行session的比对。
2.sessionID生成器
<!--sessionID生成器-->
<bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>
并且配置sessionDao,sessoinDao是直接对session进行操作的地方。
<!--sessionDAO是创建,更新session,删除过期session的地方-->
<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
<!--sessionID生成器-->
<property name="sessionIdGenerator" ref="sessionIdGenerator"/>
<!--session缓存的名字,随便设置-->
<property name="activeSessionsCacheName" value="shiroSessionCache"/>
</bean>
3.将sessionID保存在cookie中
<!--将sessionID保存在cookie中-->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="sid"/>
<property name="httpOnly" value="true"/>
<property name="maxAge" value="60000"/>
</bean>
4.把session交给sessionManager管理,因为shiro是直接管理sessionManager的。
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!--1.加这个配置因为,如果不加这个设置,那么登录之后,存在一个session,关闭当前页签,再重新打开一个页签,-->
<!--就会发现url后面跟着一个jsesessionid,这样第一对于url不美观,第二直接把jsesessionid暴露出来,也不太安全。-->
<!--所以将下面这个参数设置为false即可-->
<!--出现这个问题是因为在打开页面的时候,代码中直接进行过redirect重定向,就会出现上述问题,如果不是重定向不清楚是否会出现这个问题-->
<property name="sessionIdUrlRewritingEnabled" value="false"/>
<!--过期时间,默认为30分钟-->
<property name="globalSessionTimeout" value="60000"/>
<!--删除过期的session-->
<property name="deleteInvalidSessions" value="true"/>
<!--设置管理session的各个组件-->
<property name="sessionValidationSchedulerEnabled" value="true"/>
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
<property name="sessionIdCookieEnabled" value="true"/>
<property name="sessionIdCookie" ref="sessionIdCookie"/>
<property name="sessionDAO" ref="sessionDAO"/>
</bean>
5.补上session会话管理的验证器,这里使用的shiro和quartz集成的,不要忘记在pom文件中引入。
<!--配置会话验证调度器,用来扫描失效的session-->
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">
<property name="sessionManager" ref="sessionManager"/>
<!--设置扫描失效session的时间间隔,设置为和session的时间一样,当session失效时候,直接被扫描到-->
<property name="sessionValidationInterval" value="60000"/>
</bean>
6.将sessionManager添加在security中
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--1.在进入securityManager之后,执行权限验证和授权操作都是在realm中进行,所以这里要引入我们自定义的realm-->
<property name="realm" ref="customRealm"/>
<!--2.配置登录时的记住我/下次自动登录选项-->
<property name="rememberMeManager" ref="cookieRememberMe"/>
<!--3.配置session管理的相关配置-->
<property name="sessionManager" ref="sessionManager"/>
</bean>
这样即可实现管理session。
注意:我本人的代码中登录的时候有redirect重定向,所以会出现在地址栏url后面会出现jsesessionid,如下图:
这样是及其危险的,所以在第4步,第一个配置了sessionIdUrlRewritingEnabled设置为false,就不会出现这种情况。