在登录的时候会对ip进行过滤,公司是这样做的,有点困惑,先记录下来。
#region 防攻击操作限制。 if (SetCCStatus() || NDUserDefenderLogin.Intercept()) { msg.OpCode = 9; msg.Description = "登录限制"; break; } #endregion
其中SetCCStatus()就是ip过滤的,先看下其定义吧:
#region 设置防攻击的 Session。[SetCCStatus()] /// <summary> /// 设置防攻击的 Session。 /// </summary> /// <returns>如果超过了最大限制次数,则返回<c>true</c>;否则,返回<c>false</c>。</returns> protected Boolean SetCCStatus() { Boolean status = false; if (null == HttpContext.Current.Session || null == HttpContext.Current.Session["CountForCC"])//为什么是CountForCC { // 如果没有 Session,则创建。 HttpContext.Current.Session["CountForCC"] = 0; } Int32 count = (Int32)HttpContext.Current.Session["CountForCC"];//奇怪 session 的限制数怎么会直接到session中取呢? HttpContext.Current.Session["CountForCC"] = count + 1; Int32 maxCount = Int32.Parse(SystemConfig.Get("AqReg_Login_MaxCCCount"));//最大的限制数 它是怎么知道“AqReg_Login_MaxCCCount” if (count > maxCount) { status = true; LogAssist.GetLogger("CC\\Max").Warn(SysVariable.GetIPAddress()); } return status; } #endregion
那么我们来看下 Int32 maxCount = Int32.Parse(SystemConfig.Get("AqReg_Login_MaxCCCount"));//最大的限制数 它是怎么知道“AqReg_Login_MaxCCCount”
先看这个SystemConfig.Get("AqReg_Login_MaxCCCount")函数再说:
/// <summary> /// 获取配置信息。 /// </summary> /// <param name="key">配置键。</param> /// <returns>配置值。</returns> public static String Get(String key) { if (store.Count == 0 || lastLoadTime.AddMinutes(5) < DateTime.Now) { String message = 0 == store.Count ? "基础配置为空,去数据库载。" : "到点自动重新加载配置。"; LogAssist.GetLogger("SystemConfig\\Debug").Debug(message); Loading(); } var config = store.Where(p => p.SysKey.ToLower().Trim() == key.ToLower().Trim()).FirstOrDefault(); if (config == null) { throw new Exception(string.Format("SystemConfig.{0} Not Exists!", key)); } else { return config.SysValue; } }
那么Get得到的参数是 AqReg_Login_MaxCCCount,这是个怎么样的参数,可以获得配置的值?先看下这个函数的实现:
/// <summary> /// 获取配置信息。 /// </summary> /// <param name="key">配置键。</param> /// <returns>配置值。</returns> public static String Get(String key) { if (store.Count == 0 || lastLoadTime.AddMinutes(5) < DateTime.Now) { String message = 0 == store.Count ? "基础配置为空,去数据库载。" : "到点自动重新加载配置。"; LogAssist.GetLogger("SystemConfig\\Debug").Debug(message); Loading(); } var config = store.Where(p => p.SysKey.ToLower().Trim() == key.ToLower().Trim()).FirstOrDefault(); if (config == null) { throw new Exception(string.Format("SystemConfig.{0} Not Exists!", key)); } else { return config.SysValue; } }
看下这个函数可以知道 传进来的key其实是对store(配置信息进行查询),看下store 的定义吧:
/// <summary>
/// 配置信息集合。
/// </summary>
static List<SystemConfigInfo> store;
不用说SystemConfigInfo就是个实体类了,看下这个实体类定义了什么:
/// <summary> /// 系统配置信息。 /// </summary> class SystemConfigInfo { #region 存储字段。 String _syskey; String _sysvalue; #endregion #region 获取键名称。 /// <summary> /// 获取键名称。 /// </summary> /// <value>键名称。</value> public String SysKey { get { return _syskey; } } #endregion #region 获取值。 /// <summary> /// 获取值。 /// </summary> /// <value>值。</value> public String SysValue { get { return _sysvalue; } } #endregion #region 创建实例。[Instance(IDataReader idr)] /// <summary> /// 创建实例。 /// </summary> /// <param name="idr">数据流对象。</param> /// <returns>系统配置信息。</returns> internal static SystemConfigInfo Instance(IDataReader idr) { SystemConfigInfo obj = new SystemConfigInfo(); obj._syskey = idr["config_key_name"].ToString(); if (FormatAssist.Convert2Boolean(idr["config_iscrypto"], false) && !String.IsNullOrEmpty(idr["config_value"].ToString().Trim())) { // 需要解密。 try { obj._sysvalue = PDesc.Decrypt(idr["config_value"].ToString(), PDesc.Key); } catch (Exception ex) { LogAssist.GetLogger("SystemConfig\\BaseConfig").Fatal("Loading:" + obj._syskey, ex); obj._sysvalue = String.Empty; } } else { obj._sysvalue = idr["config_value"].ToString(); } return obj; } #endregion }
获得的配置信息要加载Loading()函数,这个函数其实就是实现配置信息的实例化的。
这个Loading()函数要到数据库中查询配置信息:
/// <summary> /// 加载配置信息。 /// </summary> static void Loading() { lastLoadTime = DateTime.Now; try { List<SystemConfigInfo> tmp = new List<SystemConfigInfo>(); using (IDataReader idr = SubSqlHelper.ExecuteReader(BaseConfig, CommandType.Text, "SELECT * FROM [dbo].[userdbconfig_varchar] WITH(NOLOCK);")) { while (idr.Read()) { tmp.Add(SystemConfigInfo.Instance(idr)); } } store = tmp; // 加载成功附加到正在使用的缓存中。 LogAssist.GetLogger("SystemConfig\\Debug").Debug("基础配置加载成功。"); } catch (Exception ex) { LogAssist.GetLogger("SystemConfig\\BaseConfig").Fatal("Loading", ex); } }