C#实现网页的路径过滤,过滤掉没有登录的访问
- 设置不过滤的文件类型
- 设置不过滤的文件
- 设置指定用户不过滤的文件(程序中管理员和普通用户的区别,普通用户只能访问部分的页面)
使用的是httpModules,在IIS服务器上要改成经典模式
web.config:
增加配置源:需要过滤什么类型的文件和不过滤的文件名称
<span style="font-size:18px;"><appSettings>
<add key="filterType" value=".aspx"/>
<add key="unFilterList" value="/admin/login.aspx,/admin/checkCode.aspx"/>
<add key="userUnFilterList" value="...."/>
</appSettings></span>
添加配置自己写的过滤器
<span style="font-size:18px;"><system.web>
<httpModules>
<!--配置 type 为命名空间-->
<add name="RequestFilter" type="RequestFilter">
</httpModules>
</system.web></span>
过滤器的编写:
继承接口: IHttpModule会要求实现4个接口方法
<span style="font-size:18px;">Dispose();
Init(HttpApplication application);
Application_BeginRequest(Object source, EventArgs e);
Application_EndRequest(Object source, EventArgs e); </span>
init是创建过滤器时调用,dispose为摧毁时,建议使用,因为C#的过滤机制的层次关系,在begin和end层是获取不到Session的数据的,建议使用层次更高的Acquire
<span style="font-size:18px;">//Application_BeginRequest(Object source, EventArgs e);
//Application_EndRequest(Object source, EventArgs e);
application_AcquireRequestState(object sender, EventArgs e);</span>
读取卸载web.config的数据的全局静态类
<span style="font-size:18px;">public static class ConfigString{
public static string unFilterList = ConfigurationManager.AppSettings["unFilterList"] == null ? "" : ConfigurationManager.AppSettings["unFilterList"].ToString();
public static string filterType = ConfigurationManager.AppSettings["filterType"] == null ? "" : ConfigurationManager.AppSettings["filterType"].ToString();
public static string userUnFilterList=ConfigurationManager.AppSettings["userUnFilterList"]==null?"":ConfigurationManager.AppSettings["userUnFilterList"].ToString();
}
</span>
完整实例:
public class RequestFilter : IHttpModule{//过滤 public void Dispose() { } string[] filterType;//要过滤的文件类型 string[] unFilterList;//不过滤的列表,例如index.html等 string[] userUnFilterList; //初始化,获取在web.config的配置数据 public void Init(HttpApplication application) { application.AcquireRequestState += application_AcquireRequestState;//使用+=,相当于在原始的基础上加上自定义的过滤部分 filterType = ConfigString.filterType.Split(','); unFilterList = ConfigString.unFilterList.Split(','); userUnFilterList=ConfigString.userUnFilterList.Split(','); } //csharp的过滤层次有错层,层次级别越高越好,例如在begin中就获取不到session的数据 //过滤的具体实现 void application_AcquireRequestState(object sender, EventArgs e) { //数据源 HttpApplication app = (HttpApplication)sender; HttpContext context = app.Context; //当前文件类型在应该过滤的文件类型中 if (Array.IndexOf(filterType, app.Request.CurrentExecutionFilePathExtension) >= 0) { //不过滤页面排除,当前页面在不需要过滤的列表中 if (Array.IndexOf(unFilterList, app.Request.FilePath) >= 0) { return; } //执行过滤操作 else { //用户没有登录,或者session已经超时,导致session内容为空,此时要求用户重新登录 if (context.Session == null || context.Session["userId"] == null) { string strRoot = app.Request.ApplicationPath; if (strRoot == "/") { strRoot = ""; } string strScript = "<script language=\"javascript\" type=\"text/javascript\">" + "alert(\"您还没有登录或者登录已超时,请重新登录!\");" + "window.parent.location.href = \"" + strRoot + "/admin/login.aspx\"" + "</script>"; app.Response.Write(strScript); app.Response.End(); return; } } //普通用户不过滤文件 if(int.parse(Session["userId"].ToString())>0){ if(Array.IndexOf(userUnFilterList, app.Request.FilePath) >= 0){ return ; }else{ //......................to do redict } } } else { return; } }