• shiro回话管理


    目录

    一、会话管理

    1.1会话监听器

     SessionDao

     二、案例

    三、缓存管理

    3.1 初识缓存

    3.2 ehcache.xml介绍

    3.3 Ehcache的初步使用

    3.4 Ehcache完成realm授权


    一、会话管理

    Shiro独立的会话管理,包含了单点登录的业务场景;Nginx负载多个tomcat;

     Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Tomcat),不管是J2SE还是J2EE环境都可以使用,提供了会话管理,会话事件监听,会话存储/持久化,容器无关的集群,失效/过期支持,对Web的透明支持,SSO单点登录的支持等特性。
      
      所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据。如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。
     

    1.1会话监听器

    1. package com.zlp.ssm.shiro;
    2. import org.apache.shiro.session.Session;
    3. import org.apache.shiro.session.SessionListener;
    4. public class ShiroSessionListener implements SessionListener {
    5. @Override
    6. public void onStart(Session session) {
    7. System.out.println("ShiroSessionListener.onstart..."+session.getId());
    8. }
    9. @Override
    10. public void onStop(Session session) {
    11. System.out.println("ShiroSessionListener.onStop..."+session.getId());
    12. }
    13. @Override
    14. public void onExpiration(Session session) {
    15. System.out.println("ShiroSessionListener.onExpiration..."+session.getId());
    16. }
    17. }

     SessionDao


    Shiro提供SessionDAO用于会话的CRUD,即DAO(Data Access Object)模式实现。
      1)AbstractSessionDAO:提供了SessionDAO的基础实现,如生成会话ID等
      2)CachingSessionDAO:提供了对开发者透明的会话缓存的功能,需要设置相应的CacheManager 
      3)MemorySessionDAO:直接在内存中进行会话维护(默认方式)
      4)EnterpriseCacheSessionDAO:提供了缓存功能的会话维护,默认情况下使用MapCache实现,内部使用ConcurrentHashMap保存缓存的会话。 
     

     二、案例

    自定义一个监听器类并实现SessionListener接口

      在Spring与shiro的整合配置文件中配置相关文件 

     SessionLestentener 

    1. package com.zlp.shiroo;
    2. import org.apache.shiro.session.Session;
    3. import org.apache.shiro.session.SessionListener;
    4. public class SessionLestentener implements SessionListener {
    5. @Override
    6. public void onStart(Session session) {
    7. System.out.println("SessionLestentener.onStart "+session.getId());
    8. }
    9. @Override
    10. public void onStop(Session session) {
    11. System.out.println("SessionLestentener.onStop "+session.getId());
    12. }
    13. @Override
    14. public void onExpiration(Session session) {
    15. System.out.println("SessionLestentener.onExpiration "+session.getId());
    16. }
    17. }

    Spring-shiro.xml 

    1. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    2. <property name="realm" ref="shiroRealm" />
    3. <property name="sessionManager" ref="sessionManager">property>
    4. bean>
    5. <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator">
    6. bean>
    7. <bean id="customSessionDao" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO">
    8. <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
    9. bean>
    10. <bean id="shiroSessionListener" class="com.zlp.ssm.shiro.ShiroSessionListener"/>
    11. <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
    12. <constructor-arg value="shiro.session"/>
    13. <property name="maxAge" value="-1"/>
    14. <property name="httpOnly" value="true"/>
    15. bean>
    16. <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
    17. <property name="globalSessionTimeout" value="120000"/>
    18. <property name="sessionDAO" ref="customSessionDao"/>
    19. <property name="sessionValidationInterval" value="60000"/>
    20. <property name="deleteInvalidSessions" value="true"/>
    21. <property name="sessionListeners">
    22. <list>
    23. <ref bean="shiroSessionListener"/>
    24. list>
    25. property>
    26. <property name="sessionIdCookie" ref="sessionIdCookie"/>
    27. <property name="sessionIdUrlRewritingEnabled" value="false"/>
    28. bean>

    三、缓存管理

    解决反复授权查询数据库的问题

    3.1 初识缓存

    1. package com.zlp.ssm.ehcache;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. /**
    5. * 利用map集合简易实现缓存原理
    6. * @author zjjt
    7. *
    8. */
    9. public class EhcacheDemo1 {
    10. static Map<String, Object> cache = new HashMap<String, Object>();
    11. static Object getValue(String key) {
    12. Object value = cache.get(key);
    13. if(value == null) {
    14. System.out.println("hello zs");
    15. cache.put(key, new String[] {"zs"});
    16. return cache.get(key);
    17. }
    18. return value;
    19. }
    20. public static void main(String[] args) {
    21. System.out.println(getValue("sname"));
    22. System.out.println(getValue("sname"));
    23. }
    24. }

    3.2 ehcache.xml介绍

    1. "1.0" encoding="UTF-8"?>
    2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    4. updateCheck="false">
    5. <diskStore path="D://xxx"/>
    6. <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
    7. timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
    8. <cache name="com.javaxl.one.entity.User" eternal="false" maxElementsInMemory="100"
    9. overflowToDisk="true" diskPersistent="true" timeToIdleSeconds="0"
    10. timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU"/>
    11. ehcache>

    3.3 Ehcache的初步使用

    1. package com.zlp.ssm.ehcache;
    2. import net.sf.ehcache.Cache;
    3. import net.sf.ehcache.CacheManager;
    4. import net.sf.ehcache.Element;
    5. import java.io.InputStream;
    6. public class EhcacheUtil {
    7. private static CacheManager cacheManager;
    8. static {
    9. try {
    10. InputStream is = EhcacheUtil.class.getResourceAsStream("/ehcache.xml");
    11. cacheManager = CacheManager.create(is);
    12. } catch (Exception e) {
    13. throw new RuntimeException(e);
    14. }
    15. }
    16. private EhcacheUtil() {
    17. }
    18. public static void put(String cacheName, Object key, Object value) {
    19. Cache cache = cacheManager.getCache(cacheName);
    20. if (null == cache) {
    21. //以默认配置添加一个名叫cacheName的Cache
    22. cacheManager.addCache(cacheName);
    23. cache = cacheManager.getCache(cacheName);
    24. }
    25. cache.put(new Element(key, value));
    26. }
    27. public static Object get(String cacheName, Object key) {
    28. Cache cache = cacheManager.getCache(cacheName);
    29. if (null == cache) {
    30. //以默认配置添加一个名叫cacheName的Cache
    31. cacheManager.addCache(cacheName);
    32. cache = cacheManager.getCache(cacheName);
    33. }
    34. Element element = cache.get(key);
    35. return null == element ? null : element.getValue();
    36. }
    37. public static void remove(String cacheName, Object key) {
    38. Cache cache = cacheManager.getCache(cacheName);
    39. cache.remove(key);
    40. }
    41. }

     演示利用缓存存储数据

    1. package com.zlp.ssm.ehcache;
    2. /**
    3. * 演示利用缓存存储数据
    4. * @author Administrator
    5. *
    6. */
    7. public class EhcacheDemo2 {
    8. public static void main(String[] args) {
    9. System.out.println(System.getProperty("java.io.tmpdir"));
    10. // EhcacheUtil.put("com.javaxl.four.entity.Book", 11, "zhangsan");
    11. // System.out.println(EhcacheUtil.get("com.javaxl.four.entity.Book", 11));
    12. EhcacheUtil.put("com.javaxl.one.entity.User", 11, "zhangsan");
    13. System.out.println(EhcacheUtil.get("com.javaxl.one.entity.User", 11));
    14. }
    15. }

    3.4 Ehcache完成realm授权

    1. package com.zlp.ssm.shiro;
    2. import com.zlp.ssm.biz.UserBiz;
    3. import com.zlp.ssm.ehcache.EhcacheUtil;
    4. import com.zlp.ssm.model.User;
    5. import org.apache.shiro.authc.AuthenticationException;
    6. import org.apache.shiro.authc.AuthenticationInfo;
    7. import org.apache.shiro.authc.AuthenticationToken;
    8. import org.apache.shiro.authc.SimpleAuthenticationInfo;
    9. import org.apache.shiro.authz.AuthorizationInfo;
    10. import org.apache.shiro.authz.SimpleAuthorizationInfo;
    11. import org.apache.shiro.realm.AuthorizingRealm;
    12. import org.apache.shiro.subject.PrincipalCollection;
    13. import org.apache.shiro.util.ByteSource;
    14. import java.util.Set;
    15. public class Myrealm extends AuthorizingRealm {
    16. private UserBiz userBiz;
    17. public UserBiz getUserBiz() {
    18. return userBiz;
    19. }
    20. public void setUserBiz(UserBiz userBiz) {
    21. this.userBiz = userBiz;
    22. }
    23. @Override
    24. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    25. System.out.println("用户授权...");
    26. String username = principals.getPrimaryPrincipal().toString();
    27. User user = userBiz.queryByName(username);
    28. String user_role_key = "user:roles:";
    29. String user_pers_key = "user:pers:";
    30. Set<String> roles = userBiz.getRolesByUserId(user.getUsername());
    31. Set<String> pers = userBiz.getPersByUserId(user.getUsername());
    32. if(roles == null||roles.size()==0){
    33. System.out.println("从数据库中获取相关角色信息...");
    34. roles=userBiz.getRolesByUserId(user.getUsername());
    35. EhcacheUtil.put(user_role_key+user.getUserid(),user.getUserid(),roles);
    36. }
    37. if(pers==null||pers.size()==0){
    38. System.out.println("从数据库中获取相关权限信息...");
    39. pers=userBiz.getPersByUserId(user.getUsername());
    40. EhcacheUtil.put(user_pers_key+user.getUserid(),user.getUserid(),pers);
    41. }
    42. SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
    43. info.setRoles(roles);
    44. info.setStringPermissions(pers);
    45. return info;
    46. }
    47. @Override
    48. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    49. System.out.println("身份验证...");
    50. String username = token.getPrincipal().toString();
    51. String password = token.getCredentials().toString();
    52. User user = userBiz.queryByName(username);
    53. AuthenticationInfo info=new SimpleAuthenticationInfo(
    54. user.getUsername(),
    55. user.getPassword(),
    56. ByteSource.Util.bytes(user.getSalt()),
    57. this.getName()
    58. );
    59. return info;
    60. }
    61. }

    今天的分享就到这啦!!!我们下期再见~~~~

  • 相关阅读:
    技术点:前端缓存(web 缓存)详解
    ILRuntime使用指南
    我们用到的3种Mock测试方案​
    Linux操作系统安装与gcc和内核升级
    初始化antdv项目,按需引入
    回溯法(Java)
    Hadoop大数据初入门----haddop伪分布式安装
    【Java 进阶篇】JDBC ResultSet 类详解
    【JAVA】项目部署
    什么是CDN?CDN的技术原理是什么?
  • 原文地址:https://blog.csdn.net/weixin_63544775/article/details/126581078