实现自定义Session

1. 回话状态接口

 /// <summary>
    /// 会话状态策略接口
    /// </summary>
    public partial interface ISessionStrategy
    {
        /// <summary>
        /// 过期时间(单位为秒)
        /// </summary>
        int Timeout { get; }

        /// <summary>
        /// 获得用户会话状态数据
        /// </summary>
        /// <param name="sid">sid</param>
        /// <returns>Dictionary<string,object>类型</returns>
        Dictionary<string,object> GetSession(string sid);

        /// <summary>
        /// 移除用户会话状态数据
        /// </summary>
        /// <param name="sid">sid</param>
        void RemoverSession(string sid);

        /// <summary>
        /// 获得用户会话状态数据的数据项的值
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <returns>当前键值不存在时返回null</returns>
        object GetValue(string sid, string key);

        /// <summary>
        /// 设置用户会话状态数据的数据项
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        void SetItem(string sid, string key, object value);

        /// <summary>
        /// 移除用户会话状态数据的数据项
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        void RemoveItem(string sid, string key);
    }

2.接口实现

/// <summary>
    /// 基于Asp.Net缓存的会话状态策略
    /// </summary>
    public partial class SessionStrategy : ISessionStrategy
    {
        private Cache _cache;//Asp.Net缓存
        private int _timeout = 600;//过期时间(单位为秒)

        public SessionStrategy()
        {
            _cache = HttpRuntime.Cache;
        }

        /// <summary>
        /// 过期时间(单位为秒)
        /// </summary>
        /// <value></value>
        public int Timeout
        {
            get { return _timeout; }
        }

        /// <summary>
        /// 获得用户会话状态数据
        /// </summary>
        /// <param name="sid">sid</param>
        /// <returns>Dictionary<string,object>类型</returns>
        public Dictionary<string, object> GetSession(string sid)
        {
            object session = _cache.Get(sid);
            if (session != null)
                return (Dictionary<string, object>)session;

            Dictionary<string, object> s = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
            _cache.Insert(sid, s, null, DateTime.Now.AddSeconds(_timeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
            return s;
        }

        /// <summary>
        /// 移除用户会话状态数据
        /// </summary>
        /// <param name="sid">sid</param>
        public void RemoverSession(string sid)
        {
            _cache.Remove(sid);
        }

        /// <summary>
        /// 获得用户会话状态数据的数据项的值
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <returns>当前键值不存在时返回null</returns>
        public object GetValue(string sid, string key)
        {
            object session = _cache.Get(sid);
            if (session == null)
            {
                return null;
            }
            else
            {
                Dictionary<string, object> s = (Dictionary<string, object>)session;
                object value = null;
                s.TryGetValue(key, out value);
                return value;
            }
        }

        /// <summary>
        /// 设置用户会话状态数据的数据项
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public void SetItem(string sid, string key, object value)
        {
            Dictionary<string, object> session = GetSession(sid);
            if (session.ContainsKey(key))
                session[key] = value;
            else
                session.Add(key, value);
        }

        /// <summary>
        /// 移除用户会话状态数据的数据项
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        public void RemoveItem(string sid, string key)
        {
            object session = _cache.Get(sid);
            if (session != null)
            {
                Dictionary<string, object> s = (Dictionary<string, object>)session;
                s.Remove(key);
            }
        }
    }

3.服务层调用

/// <summary>
    /// 会话状态操作管理类
    /// </summary>
    public partial class Sessions
    {
        private static ISessionStrategy _isessionstrategy = null;//会话状态策略

        static Sessions()
        {
            _isessionstrategy = BMASession.Instance;
        }

        /// <summary>
        /// 生成sessionid
        /// </summary>
        /// <returns></returns>
        public static string GenerateSid()
        {
            long i = 1;
            byte[] byteArray = Guid.NewGuid().ToByteArray();
            foreach (byte b in byteArray)
            {
                i *= ((int)b + 1);
            }
            return string.Format("{0:x}", i - DateTime.Now.Ticks);
        }

        /// <summary>
        /// 过期时间(单位为秒)
        /// </summary>
        /// <value></value>
        public static int Timeout
        {
            get { return _isessionstrategy.Timeout; }
        }

        /// <summary>
        /// 获得用户会话状态数据
        /// </summary>
        /// <param name="sid">sid</param>
        /// <returns>Dictionary<string,object>类型</returns>
        public static Dictionary<string, object> GetSession(string sid)
        {
            return _isessionstrategy.GetSession(sid);
        }

        /// <summary>
        /// 移除用户会话状态数据
        /// </summary>
        /// <param name="sid">sid</param>
        public static void RemoverSession(string sid)
        {
            _isessionstrategy.RemoverSession(sid);
        }

        /// <summary>
        /// 获得用户会话状态数据的数据项的值
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <returns>当前键值不存在时返回null</returns>
        public static object GetValue(string sid, string key)
        {
            if (!string.IsNullOrEmpty(key))
                return _isessionstrategy.GetValue(sid, key);
            else
                return null;
        }

        /// <summary>
        /// 获得用户会话状态数据的数据项的值
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static int GetValueInt(string sid, string key)
        {
            return TypeHelper.ObjectToInt(GetValue(sid, key));
        }

        /// <summary>
        /// 获得用户会话状态数据的数据项的值
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string GetValueString(string sid, string key)
        {
            object value = GetValue(sid, key);
            if (value != null)
                return value.ToString();
            else
                return string.Empty;
        }

        /// <summary>
        /// 设置用户会话状态数据的数据项
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public static void SetItem(string sid, string key, object value)
        {
            if (!string.IsNullOrEmpty(key))
                _isessionstrategy.SetItem(sid, key, value);
        }

        /// <summary>
        /// 移除用户会话状态数据的数据项
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        public static void RemoveItem(string sid, string key)
        {
            if (!string.IsNullOrEmpty(key))
                _isessionstrategy.RemoveItem(sid, key);
        }
    }


    /// <summary>
    /// session键类
    /// </summary>
    public partial class SessionKey
    {
        /// <summary>
        /// 图片验证码
        /// </summary>
        public const string VERIFYIMAGEVALUE = "verifyImageValue";
        /// <summary>
        /// 安全中心手机验证值
        /// </summary>
        public const string SAFEVERIFYMOBILEVALUE = "safeVerifyMoibleValue";
        /// <summary>
        /// 安全中心更新手机值
        /// </summary>
        public const string UPDATEMOBILEVALUE = "updateMoibleValue";
        /// <summary>
        /// 安全中心更新手机
        /// </summary>
        public const string UPDATEMOBILE = "updateMoible";
        /// <summary>
        /// 安全中心验证密码动作
        /// </summary>
        public const string VALIDATEPASSWORD = "validatePassword";
        /// <summary>
        /// 安全中心验证手机动作
        /// </summary>
        public const string VALIDATEMOBILE = "validateMobile";
        /// <summary>
        /// 安全中心验证邮箱动作
        /// </summary>
        public const string VALIDATEEMAIL = "validateEmail";
    }

 

4. 简洁版:

 

  /// <summary>
    /// 基于Asp.Net缓存的会话状态策略
    /// </summary>
    public partial class SessionStrategy 
    {
        private Cache _cache;//Asp.Net缓存
        private int _timeout = 600;//过期时间(单位为秒)

        public SessionStrategy()
        {
            _cache = HttpRuntime.Cache;
        }

        /// <summary>
        /// 生成sessionid
        /// </summary>
        /// <returns></returns>
        public static string GenerateSid()
        {
            long i = 1;
            byte[] byteArray = Guid.NewGuid().ToByteArray();
            foreach (byte b in byteArray)
            {
                i *= ((int)b + 1);
            }
            return string.Format("{0:x}", i - DateTime.Now.Ticks);
        }

        /// <summary>
        /// 过期时间(单位为秒)
        /// </summary>
        /// <value></value>
        public int Timeout
        {
            get { return _timeout; }
        }

        /// <summary>
        /// 获得用户会话状态数据
        /// </summary>
        /// <param name="sid">sid</param>
        /// <returns>Dictionary<string,object>类型</returns>
        public Dictionary<string, object> GetSession(string sid)
        {
            object session = _cache.Get(sid);
            if (session != null)
                return (Dictionary<string, object>)session;

            Dictionary<string, object> s = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
            _cache.Insert(sid, s, null, DateTime.Now.AddSeconds(_timeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
            return s;
        }

        /// <summary>
        /// 移除用户会话状态数据
        /// </summary>
        /// <param name="sid">sid</param>
        public void RemoverSession(string sid)
        {
            _cache.Remove(sid);
        }

        /// <summary>
        /// 获得用户会话状态数据的数据项的值
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <returns>当前键值不存在时返回null</returns>
        public object GetValue(string sid, string key)
        {
            object session = _cache.Get(sid);
            if (session == null)
            {
                return null;
            }
            else
            {
                Dictionary<string, object> s = (Dictionary<string, object>)session;
                object value = null;
                s.TryGetValue(key, out value);
                return value;
            }
        }

        /// <summary>
        /// 设置用户会话状态数据的数据项
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public void SetItem(string sid, string key, object value)
        {
            Dictionary<string, object> session = GetSession(sid);
            if (session.ContainsKey(key))
                session[key] = value;
            else
                session.Add(key, value);
        }

        /// <summary>
        /// 移除用户会话状态数据的数据项
        /// </summary>
        /// <param name="sid">sid</param>
        /// <param name="key"></param>
        public void RemoveItem(string sid, string key)
        {
            object session = _cache.Get(sid);
            if (session != null)
            {
                Dictionary<string, object> s = (Dictionary<string, object>)session;
                s.Remove(key);
            }
        }
    }

    /// <summary>
    /// session键类(根据实际情况定义)
    /// </summary>
    public partial class SessionKey
    {
        /// <summary>
        /// 图片验证码
        /// </summary>
        public const string VERIFYIMAGEVALUE = "verifyImageValue";
        /// <summary>
        /// 安全中心手机验证值
        /// </summary>
        public const string SAFEVERIFYMOBILEVALUE = "safeVerifyMoibleValue";
        /// <summary>
        /// 安全中心更新手机值
        /// </summary>
        public const string UPDATEMOBILEVALUE = "updateMoibleValue";
        /// <summary>
        /// 安全中心更新手机
        /// </summary>
        public const string UPDATEMOBILE = "updateMoible";
        /// <summary>
        /// 安全中心验证密码动作
        /// </summary>
        public const string VALIDATEPASSWORD = "validatePassword";
        /// <summary>
        /// 安全中心验证手机动作
        /// </summary>
        public const string VALIDATEMOBILE = "validateMobile";
        /// <summary>
        /// 安全中心验证邮箱动作
        /// </summary>
        public const string VALIDATEEMAIL = "validateEmail";
    }

 

转载于:https://www.cnblogs.com/fuqiang88/p/6607630.html

好的,我可以回答你关于 Spring Boot 自定义 Session 的问题。 在 Spring Boot 中,Session 的默认实现是基于 Servlet 的 HttpSession 接口。如果你想要自定义 Session 实现,可以通过实现 Spring SessionSession 接口,并在配置文件中指定该实现实现。 下面是一个使用 Redis 存储的自定义 Session 实现的示例代码: 首先,创建一个 RedisSession 类,实现 Session 接口,并实现相应的方法,如下所示: ```java public class RedisSession implements Session { private final String id; private Map<String, Object> attributes = new HashMap<>(); private boolean isNew; public RedisSession(String id) { this.id = id; this.isNew = true; } @Override public String getId() { return this.id; } @Override public <T> T getAttribute(String name) { return (T) this.attributes.get(name); } @Override public void setAttribute(String name, Object value) { this.attributes.put(name, value); this.isNew = false; } @Override public void removeAttribute(String name) { this.attributes.remove(name); } @Override public Instant getCreationTime() { throw new UnsupportedOperationException(); } @Override public void setLastAccessedTime(Instant lastAccessedTime) { throw new UnsupportedOperationException(); } @Override public Instant getLastAccessedTime() { throw new UnsupportedOperationException(); } @Override public void setMaxInactiveInterval(Duration interval) { throw new UnsupportedOperationException(); } @Override public Duration getMaxInactiveInterval() { throw new UnsupportedOperationException(); } @Override public boolean isExpired() { throw new UnsupportedOperationException(); } public boolean isNew() { return this.isNew; } } ``` 然后,创建一个 RedisSessionRepository 类,实现 SessionRepository 接口,并实现相应的方法,如下所示: ```java public class RedisSessionRepository implements SessionRepository<RedisSession> { private final RedisTemplate<String, RedisSession> redisTemplate; public RedisSessionRepository(RedisTemplate<String, RedisSession> redisTemplate) { this.redisTemplate = redisTemplate; } @Override public RedisSession createSession() { String id = UUID.randomUUID().toString(); RedisSession session = new RedisSession(id); this.redisTemplate.opsForValue().set(id, session); return session; } @Override public void save(RedisSession session) { this.redisTemplate.opsForValue().set(session.getId(), session); } @Override public RedisSession findById(String id) { return this.redisTemplate.opsForValue().get(id); } @Override public void deleteById(String id) { this.redisTemplate.delete(id); } } ``` 最后,在 Spring Boot 的配置文件中指定使用 RedisSessionRepository 实现 SessionRepository,如下所示: ```properties spring.session.store-type=redis spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.timeout=10000 spring.session.redis.flush-mode=on_save spring.session.redis.namespace=spring:session spring.session.repository-type=redis ``` 以上就是关于 Spring Boot 自定义 Session 的步骤,希望能帮到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值