拦截asp.net mvc输出流做处理, 拦截HTML文本(asp.net MVC版)

  以前的一个贴子写过一个webForm的拦截HTML输出流的版本,最近用到mvc时用同样的方式发生一些问题。

  如下图

查了好久也不知道啥原因。

好吧, 我最后选择放弃。

  想起以前自定义Response.Filter 时,里面Write方法可以获取页面流的信息。

  这次我借用HttpModule实现拦截HTML内容输出流,下面看代码

一、HtmlHttpModule.cs    定义一个新类继承HttpModule

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace Monitor
{
    public class HtmlHttpModule : IHttpModule
    {
        private HttpApplication _contextApplication;
        private TextWriter tw_old;    // 旧流
        private StringBuilder _content;
        private FieldInfo tw_field;

        public void Init(HttpApplication application)
        {
            _contextApplication = application;
            _contextApplication.BeginRequest += new EventHandler(_contextApplication_BeginRequest);
            _contextApplication.EndRequest += new EventHandler(_contextApplication_EndRequest);
        }

        void _contextApplication_BeginRequest(object sender, EventArgs e)
        {
            #region
            try
            {
                _content = new StringBuilder();
                _contextApplication.Response.Filter = new DefaultFilter(_contextApplication.Response.Filter, o => _content.Append(o));   //用自定义的Filter筛选器
            }
            catch (Exception ex)
            {
                //这里写入日志
            }
            #endregion
        }

        void _contextApplication_EndRequest(object sender, EventArgs e)
        {
            #region
            try
            {          #region          //这里就是写处理HTML的代码了。现在HTML的文本保存在_content中,取出处理就可以
          //处理完放出下面的Write中          #endregion          
                _contextApplication.Response.Write(_content.ToString());
            }
            catch (Exception ex)
            {
                //这里写入日志
            }
            #endregion
        }

        public void Dispose()
        {
            _contextApplication = null;
            if (_contextApplication != null)
            {
                _contextApplication.Dispose();
            }
        }

    }
}

二、DefaultFilter.cs     在module中我们给Response.Filter 自定义的筛选器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Web;

namespace Monitor
{
    public class DefaultFilter : Stream
    {
        Stream responseStream;
        long position;
        Action<String> action;

        public DefaultFilter(Stream inputStream,Action<String> act)
        {
            action = act;
            responseStream = inputStream;
        }

        public override bool CanRead
        {
            get
            {
                return responseStream.CanRead;
            }
        }
        public override bool CanSeek
        {
            get
            {
                return responseStream.CanSeek;
            }
        }

        public override bool CanWrite
        {
            get
            {
                return responseStream.CanWrite;
            }
        }

        public override long Length
        {
            get
            {
                return responseStream.Length;
            }
        }

        public override long Position
        {
            get
            {
                return position;
            }
            set
            {
                position = value;
            }
        }
        public override void Flush()
        {
            responseStream.Flush();
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return responseStream.Read(buffer, offset, count);
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            return responseStream.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            responseStream.SetLength(value);
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            action(HttpContext.Current.Response.ContentEncoding.GetString(buffer, offset, count));
        }
    }
}

三、web.config   该创建都创建好了,现在就让它在mvc中起作用吧

<system.webServer>
    <modules>
      <add name="Monotpr" type="Monitor.HtmlHttpModule,Monitor"/>
    </modules>
  </system.webServer>
时间: 2024-11-10 07:35:01

拦截asp.net mvc输出流做处理, 拦截HTML文本(asp.net MVC版)的相关文章

拦截asp.net输出流做处理, 拦截HTML文本

对已经生成了HTML的页面做一些输出到客户端之前的处理 方法的原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有的向页面输出都变 成了向StringBuilder输出,然后我们对StringBuilder处理完成之后,再把Response的输出重定向到原来的页面上,然后再通 过Response.Write方法把StringBuilder的内容输出到页面上 这里之所以用反射,是因为Response对象的OutPut属性是只读的,通过

Spring MVC实现的登录拦截器

之前接触过struts拦截器,但是没有使用过Spring MVC拦截器,今天花了一天时间好好研究了一下. 定义拦截器 SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Sp

0002 - Spring MVC 拦截器源码简析:拦截器加载与执行

1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日志.判断用户是否登录等. 2.简单示例 2.1.继承 HandlerInterceptorAdapter 抽象类实现一个拦截器.代码如下: public class DemoInterceptor extends HandlerInterceptorAdapter { @Override    pu

Spring mvc:配置不拦截指定的路径

<!-- 访问拦截 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/**"/> <!-- 不拦截的url --> <mvc:exclude-mapping path="/wechatController/"/> <bean class="com.cd.interceptor.LoginHandlerI

Spring MVC全局异常处理与拦截器校检

在使用Spring MVC进行开发时,总是要对系统异常和用户的异常行为进行处理,以提供给用户友好的提示,也可以提高系统的安全性. 拦截系统响应错误 首先是拦截系统响应错误,这个可以在web.xml中配置,根据错误代码跳转到相应的提示页面.这里要注意一个问题,错误处理页面所用到的静态资源最好是直接写在页面中,或者同一个文件夹下,因为如果用户访问了一个系统不存在的路径,例如:**/ss/kk/ll/tt.jsp这样就会有404错误就会跳转到相应的处理页面,但是这个处理页面中的静态资源的路径就会变成*

Spring MVC中使用Interceptor拦截器

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间. 一.定义Interceptor实现类 SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Intercep

Spring3中的mvc:interceptors标签配置拦截器

mvc:interceptors 这个标签用于注册一个自定义拦截器或者是WebRequestInterceptors. 可以通过定义URL来进行路径请求拦截,可以做到较为细粒度的拦截控制. 例如在配置文件加入 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc=&qu

springboot+springmvc拦截器做登录拦截

springboot+springmvc拦截器做登录拦截 LoginInterceptor 实现 HandlerInterceptor 接口,自定义拦截器处理方法 LoginConfiguration 实现 WebMvcConfigurer 接口,注册拦截器 ResourceBundle 加载 properties文件数据,配置不进行拦截的路径 LoginInterceptor package com.ytkj.smart_sand.system.interceptor; import com.

ASP.Net MVC开发基础学习笔记:一、走向MVC模式

一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到数据库去取出数据(其中的经过怎样的BLL到DAL这里就不谈了),然后再由