asp.net webform request 过滤

部门有一个老程序,是用asp.net 的webform开发的,如果是mvc框架的话,是比较容易开发一个统一的过滤器来统一过滤特殊字符串,但是webform中request的params集合是只读的,在任何阶段都无法更改。

考虑可以在前端加一个网关,例如zuul,或是nginx,zuul可以修改header是肯定没问题的,但是不知道是不是支持修改request参数,也没有实际操作,暂时考虑是否有别的办法执行,如果实在没有别的方法,就只能试试这个方案了

第二种解决方式,是想在httpmodule阶段过滤,但是还是那个问题,request的params集合不可更改,哪怕是先删除再添加也不行

第三种方式,后来在网上搜索到在global.asax中的Application_BeginRequest方法中注册一个request的过滤器,这个过滤器继承自System.IO.Stream类,然后在这个过滤器中去取buffer数组的时候,替换buffer数组,经测试,可以实现过滤效果

public class ResponseFilter:Stream
{
#region properties
Stream responseStream;
long position;
StringBuilder html = new StringBuilder();
#endregion
#region constructor
public ResponseFilter(Stream inputStream)
{
responseStream = inputStream;
}
#endregion
#region implemented abstract members
public override bool CanRead
{
get { return true; }
}
public override bool CanSeek
{
get { return true; }
}
public override bool CanWrite
{
get { return true; }
}
public override void Close()
{
responseStream.Close();
}
public override void Flush()
{
responseStream.Flush();
}
public override long Length
{
get { return 0; }
}
public override long Position
{
get { return position; }
set { position = value; }
}
public override long Seek(long offset, System.IO.SeekOrigin direction)
{
return responseStream.Seek(offset, direction);
}
public override void SetLength(long length)
{
responseStream.SetLength(length);
}
public override int Read(byte[] buffer, int offset, int count)
{
return responseStream.Read(buffer, offset, count);
}
#endregion
#region write method
public override void Write(byte[] buffer, int offset, int count)
{
int c = _sink.Read(buffer,offset,count);
string sBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer);
sBuffer = sBuffer.Replace("'","& #39;");
byte[] newBuffer = System.Text.UTF8Encoding.UTF8.GetBytes(sBuffer);//将过滤字符串后的结果转换成byte[]
buffer = newBuffer;//再用转换后的byte[]替换当前Stream正在读取的buffer
return c; } #endregion }

在global.asax中注册

public void Application_BeginRequest(){
Response.Filter = new ResponseFilter(Response.Filter);
}

另外,这篇文章对stream解释的特别透彻,我看过之后,才知道如何在上述代码中转换stream的buffer

参考文章

https://www.cnblogs.com/crazytomato/p/8274803.html

 

https://www.jb51.net/article/22298.htm

posted @ 2020-01-09 19:36  八方鱼  阅读(684)  评论(0)    收藏  举报