Response.Redirect在新窗口打开的另一种方法

 这里是孟子提供的方法

这里介绍Ihttpmodule处理请求管道的方法。Response.Redirect的原理是服务器设置返回http状态码为302,然后客户端执行跳转,用reflector可以看到.net的代码段。

以下是HttpResponse类的Redirect方法中的跳转代码

this.StatusCode = 0x12e
this.RedirectLocation = url;

所以,我们可以扩展Ihttpmodule来拦截http状态码,强制设为200,同时插入js代码段来实现新窗口打开。以下是Ihttpmodule的实现代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
namespace ClassLibrary2
{
    
public class Class1:System.Web.IHttpModule
    
{
        
public void Init(HttpApplication application)
        
{

            application.PreSendRequestHeaders 
+= new EventHandler(application_PreSendRequestHeaders);
        }


        
void application_PreSendRequestHeaders(object sender, EventArgs e)
        
{
            HttpApplication Application 
= (HttpApplication)sender;

            HttpContext context 
= Application.Context;

            
if (context.Response.StatusCode == 302)
            
{
                context.Response.Write(
"<script>window.open('"+context.Response.RedirectLocation+"')</script>");
                context.Response.StatusCode 
= 200;
            }


        }

 
        
public  void Dispose()
        
{
        }


        
    }

}

最后配置一下web.config就可以了

<?xml version="1.0"?>
<configuration>
    
<system.web>
        
<compilation debug="true"/>
        
<authentication mode="Windows"/>
    
<httpModules>
      
<add name="MyModule" type="ClassLibrary2.Class1,ClassLibrary2"></add>
    
</httpModules>
    
</system.web>
</configuration>

另外一点,ms自坐主张的在跳转之后,end之前插入了这么一段代码,我得b4他们一下,解决办法,大家自己想想吧。

this.Write("<html><head><title>Object moved</title></head><body> ");
        
this.Write("<h2>Object moved to <a href="" + HttpUtility.HtmlAttributeEncode(url) + "">here</a>.</h2> ");
        
this.Write("</body></html> ");
原文地址:https://www.cnblogs.com/cl1024cl/p/6204993.html