asp.net mvc使用IHttpModule拦截所有请求,包括资源文件

目录

[HttpApplication 类](#HttpApplication 类)

添加App_Code文件夹

MyHttpModel2

Web.config添加配置,在iis模块中生效

项目发布后,察看注册的自定义模块


  • 框架集:.NET Framework 4.7
  • web框架:asp.net mvc 5

HttpApplication 类

HttpApplication 类 (System.Web) | Microsoft Learn

https://learn.microsoft.com/zh-cn/dotnet/api/system.web.httpapplication?view=netframework-4.8.1#examples

定义对 ASP.NET 应用程序内所有应用程序对象公用的方法、属性和事件。 此类是用户在 Global.asax 文件中定义的应用程序的基类。

注解

类的 HttpApplication 实例是在 ASP.NET 基础结构中创建的,而不是由用户直接创建。 类的 HttpApplication 一个实例用于在其生存期内处理多个请求。 但是,一次只能处理一个请求。 因此,成员变量可用于存储每个请求的数据。

应用程序引发可由实现 IHttpModule 接口的自定义模块或 Global.asax 文件中定义的事件处理程序代码处理的事件。 实现 接口的 IHttpModule 自定义模块可以放在 App_Code 文件夹中,也可以放在 Bin 文件夹中的 DLL 中。

HttpApplication在 .NET Framework 版本 3.5 中引入。

备注

在集成模式下运行 IIS 7.0 时,App_Code文件夹或 Bin 文件夹中的自定义模块适用于请求管道中的所有请求。 Global.asax 文件中的事件处理程序代码仅适用于映射到 ASP.NET 处理程序的请求。

添加App_Code文件夹

需要将MyHttpModel2.cs放到App_Code文件夹中,右键web项目,如图操作,添加App_Code文件夹

MyHttpModel2

cs 复制代码
using RmtSendArticleHandle;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WuZiFenGongSiInfomation.Common;

namespace kantan_shi_yebu.MyHttpModel
{
    /// <summary>
    /// 自定义请求拦截
    /// </summary>
    public class MyHttpModel2 : IHttpModule
    {
        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            //context.AcquireRequestState += Context_AcquireRequestState; ;
            //context.PostAcquireRequestState += Context_PostAcquireRequestState;
            context.BeginRequest += Context_BeginRequest;
            context.Error += Context_Error;
        }

        private void Context_Error(object sender, EventArgs e)
        {
            HttpApplication httpApp = (HttpApplication)sender;
            HttpContext ctx = HttpContext.Current;
            var request = ctx.Request;
            string requestURL = request.Url.OriginalString;
            WuZiFenGongSiInfomation.Common.LogHelpter.AddLog("请求的url=" + requestURL, null, "MyHttpModel2.Context_Error");

            var response = ctx.Response;

            //XSS漏洞拦截,url注入拦截
            //http://localhost:8034/content/images/*~1*/a.aspx?aspxerrorpath=/                 
            if (requestURL.Contains("*") || requestURL.Contains("~"))
            {
                response.StatusCode = 400;
                response.ContentType = "text/plain; charset=utf-8";
                response.Write("http 400,不允许特殊符号");
                ctx.ClearError();
            }
            else if (requestURL.Contains(".aspx"))
            {
                response.StatusCode = 400;
                response.ContentType = "text/plain; charset=utf-8";
                response.Write("http 400,不允许请求.aspx页面");
               
                ctx.ClearError();
            }
          
        }

        private void Context_BeginRequest(object sender, EventArgs e)
        {
            //可以记录所有请求,包括后台请求、静态文件请求url
            HttpApplication httpApp = (HttpApplication)sender;
            HttpContext ctx = HttpContext.Current;
            var request = ctx.Request;
            string requestURL = request.Url.OriginalString;
            WuZiFenGongSiInfomation.Common.LogHelpter.AddLog("请求的url=" + requestURL, null, "MyHttpModel2");
        }

    }
}

Web.config添加配置,在iis模块中生效

XML 复制代码
<system.webServer>
	<validation validateIntegratedModeConfiguration="false"></validation> 
	<security>
		<requestFiltering>
			<requestLimits maxQueryString="102400" maxAllowedContentLength="102400000" />
		</requestFiltering>
	</security>
 
	<modules>
		<add name="MyHttpModel2" type="kantan_shi_yebu.MyHttpModel.MyHttpModel2"  />
	</modules>
</system.webServer>

项目发布后,察看注册的自定义模块

选中站点,在模块中可以看到,已经注册的模块

相关推荐
超爱吃士力架1 小时前
邀请逻辑
java·linux·后端
李小白662 小时前
Spring MVC(上)
java·spring·mvc
AskHarries3 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion4 小时前
Springboot的创建方式
java·spring boot·后端
zjw_rp5 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder5 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚6 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
机器之心7 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端
.生产的驴7 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
顽疲7 小时前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端