/// <summary> /// 解析入口 /// </summary> /// <param name="urlInfo"></param> /// <param name="site"></param> /// <param name="skin"></param> /// <param name="page"></param> /// <param name="pageCode"></param> public void Parse(MaUrl urlInfo, IMaSite site, IMaSkin skin, MaPage page, ref StringBuilder pageCode) { //处理页面临时变量 foreach (KeyValuePair <string, string> item in Htmx.HtmxHandler.GetThisPageTempVariable()) { pageCode = pageCode.Replace("{$" + item.Key + "}", item.Value); } //处理页面变量 foreach (KeyValuePair <string, string> item in page.GetPageVariable()) { pageCode = pageCode.Replace("{$" + item.Key + "}", item.Value); } //处理皮肤变量 foreach (KeyValuePair <string, string> item in ((MaConfig)skin).Variables) { pageCode = pageCode.Replace("{$" + item.Key + "}", item.Value); } //处理站点变量 foreach (KeyValuePair <string, string> item in ((MaConfig)site).Variables) { pageCode = pageCode.Replace("{$" + item.Key + "}", item.Value); } //处理基本变量 pageCode = pageCode.Replace("{$_ma_this_domain}", urlInfo.Domain.Domain); pageCode = pageCode.Replace("{$_ma_this_root_domain}", urlInfo.Domain.MainDomain); }
/// <summary> /// 初始化页面信息 /// </summary> /// <param name="context"></param> /// <param name="url"></param> /// <param name="web"></param> /// <param name="site"></param> /// <param name="skin"></param> /// <param name="page"></param> public virtual void InitPage(HttpContext context, MaUrl url, IMaWeb web, IMaSite site, IMaSkin skin, MaPage page) { //Http对象 Context = context; Request = context.Request; Response = context.Response; //Ma对象 m_maUrl = url; m_maweb = web; m_maSite = site; m_maSkin = skin; m_maPage = page; }
/// <summary> /// 标签处理虚方法 /// </summary> /// <param name="urlInfo"></param> /// <param name="site"></param> /// <param name="skin"></param> /// <param name="page"></param> /// <param name="pageCode"></param> public virtual void Parse(MaUrl urlInfo, IMaSite site, IMaSkin skin, MaPage page, ref StringBuilder pageCode) { if (string.IsNullOrEmpty(m_tagRegexStr)) { throw new Exception("解析表情出错,当前类没有标签匹配字符串串,请给[TagRegexStr]赋值"); } //查询的正则表达式 Regex re = new Regex(m_tagRegexStr, RegexOptions.IgnoreCase); MatchCollection matches = re.Matches(pageCode.ToString()); foreach (Match var in matches) { MaTag _maTag = new MaTag(var.Value, urlInfo); ParseTag(urlInfo, site, skin, page, ref pageCode, _maTag); } }
/// <summary> /// 处理标签构造函数 /// </summary> /// <param name="tagStr"></param> /// <param name="urlInfo"></param> public MaTag(string tagStr, MaUrl urlInfo) { m_urlInfo = urlInfo; m_tagStr = tagStr; m_tagName = System.Text.RegularExpressions.Regex.Replace(tagStr, TAG_REGEX, "$1", System.Text.RegularExpressions.RegexOptions.IgnoreCase).ToUpper(); //获得属性值 m_tagAttributeStr = System.Text.RegularExpressions.Regex.Replace(tagStr, TAG_REGEX, "$2", System.Text.RegularExpressions.RegexOptions.IgnoreCase); string[] tagArray = m_tagAttributeStr.Trim().Split(';'); foreach (string var in tagArray) { if (!string.IsNullOrEmpty(var) && var.Contains("=")) { string _key = var.Substring(0, var.IndexOf("=")); string _value = var.Substring(var.IndexOf("=") + 1); this[_key] = _value; } } //获得动态属性 if (!string.IsNullOrEmpty(this["regex"])) { string _url = urlInfo.AbsolutePath; if (this["regex"].Substring(0, 1) != "/") {//带域名匹配 _url = urlInfo.Domain.Domain + "/" + urlInfo.AbsolutePath; } foreach (string var in this.AllKeys) { if (this[var].Substring(0, 1) == "$") { this[var] = System.Text.RegularExpressions.Regex.Replace(_url, this["regex"], this[var]); } } } }
/// <summary> /// /// </summary> /// <param name="url"></param> /// <returns></returns> public override bool IsBrowseUrl(MaUrl url) { //throw new NotImplementedException(); return(false); }
/// <summary> /// 标签处理抽象函数 /// </summary> /// <param name="urlInfo"></param> /// <param name="site"></param> /// <param name="skin"></param> /// <param name="page"></param> /// <param name="pageCode"></param> /// <param name="tag"></param> public abstract void ParseTag(MaUrl urlInfo, IMaSite site, IMaSkin skin, MaPage page, ref StringBuilder pageCode, MaTag tag);
void application_AuthenticateRequest(object sender, EventArgs e) { HttpApplication application = (HttpApplication)sender; HttpContext context = application.Context; MaUrl _url = MaUrl.Current; if (_url.AbsolutePath == "/") { return; } //获得认证用户信息 OnAuthenticate(context); if ((context.User == null) && (MaSecurityConfig.Instance.LoginUrl != _url.AbsolutePath)) { //开放域名跳过 foreach (var item in MaSecurityConfig.Instance.OpenDoamin) { if (_url.Domain.Domain == item) { goto URLCHECK; } } //开放跳过 foreach (var item in MaSecurityConfig.Instance.OpenPath) { if (_url.AbsolutePath.IndexOf(item) == 0) { goto URLCHECK; } } //授权目录,跳转登陆页面 foreach (var item in MaSecurityConfig.Instance.AuthorizationPath) { if (_url.AbsolutePath.IndexOf(item) == 0) { #region 授权页面,未经授权的处理方式 switch (MaSecurityConfig.Instance.StopType) { case StopBrowseType.Redirect: { string _loginPage = MaSecurityConfig.Instance.LoginUrl + "?ReturnUrl=" + MaWebUtility.UrlEncode(_url.ToString()); context.Response.Redirect(_loginPage, true); } break; case StopBrowseType.Stop: { context.Response.Clear(); context.Response.End(); } break; case StopBrowseType.Exception: { throw new Exception("未经授权,禁止访问:" + MaSecurityConfig.Instance.StopInfo); } case StopBrowseType.Info: { context.Response.Clear(); context.Response.Write(MaSecurityConfig.Instance.StopInfo); context.Response.End(); } break; default: { string _loginPage = MaSecurityConfig.Instance.LoginUrl + "?ReturnUrl=" + MaWebUtility.UrlEncode(_url.ToString()); context.Response.Redirect(_loginPage, true); } break; } #endregion } } } URLCHECK: //进行URL检测 MaPrincipal _principal = context.User as MaPrincipal; if (_principal != null) { if (!_principal.IsBrowseUrl(_url)) { throw new Exception("你没有浏览该页面的权限,请与管理员联系"); } } }
/// <summary> /// 构造函数 /// </summary> /// <param name="sink"></param> /// <param name="url"></param> /// <param name="page"></param> public HtmxFilter(Stream sink, MaUrl url, MaPage page) { m_sink = sink; //非编辑模式 switch (url.RequestView) { case MaRequestView.Put: { switch (page.SaveWay) { case MaPageSaveWay.Null: break; case MaPageSaveWay.Save: { //保存静态文件 if (!(new FileInfo(url.SavePath)).Directory.Exists) { (new FileInfo(url.SavePath)).Directory.Create(); } m_fs = new FileStream(url.SavePath, FileMode.OpenOrCreate, FileAccess.Write); } break; case MaPageSaveWay.Cache: { #region 默认缓存模式 //设置页的可缓存性 HttpCacheability _cacheability = HttpCacheability.Server; if (!System.Enum.TryParse <HttpCacheability>(page.Location, out _cacheability)) { _cacheability = HttpCacheability.Server; } HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Server); //是否应忽略由使缓存无效的客户端发送的 HTTP Cache-Control 标头 HttpContext.Current.Response.Cache.SetValidUntilExpires(true); //设置页缓存的到期时间 HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddSeconds(page.UpdateTime)); HttpContext.Current.Response.Cache.SetMaxAge(new TimeSpan((long)((long)page.UpdateTime * 10000000))); //根据 HTTP 标头值进行缓存 if (!string.IsNullOrEmpty(page.Header)) { HttpContext.Current.Response.Cache.VaryByHeaders[page.Header] = true; } //使用参数对页的各个版本进行缓存 if (!string.IsNullOrEmpty(page.Param)) { HttpContext.Current.Response.Cache.VaryByParams[page.Param] = true; } //使用自定义字符串对页的各个版本进行缓存 if (!string.IsNullOrEmpty(page.Custom)) { HttpContext.Current.Response.Cache.SetVaryByCustom(page.Custom); } #endregion } break; case MaPageSaveWay.None: break; default: break; } } break; case MaRequestView.Edit: break; case MaRequestView.Update: { //模块中处理 } break; case MaRequestView.Delete: { //模块中处理 } break; case MaRequestView.Save: { //保存静态文件 if (!(new FileInfo(url.SavePath)).Directory.Exists) { (new FileInfo(url.SavePath)).Directory.Create(); } m_fs = new FileStream(url.SavePath, FileMode.OpenOrCreate, FileAccess.Write); } break; case MaRequestView.Null: { //模块中处理 } break; case MaRequestView.Cache: { //模块中处理 } break; default: break; } }