解决服务器无法在已发送 HTTP 标头之后设置状态导致的一个问题

在错误日志中经常看到服务器无法在已发送 HTTP 标头之后设置状态的提示。英文提示应是:server cannot set status after http headers have been sent

这个问题是asp.net MVC特有的现象,在webform 中从来没出现这类问题。很清楚是服务端跳转的时候出现的问题。但是要解决很难,网上的各种办法都有尝试,但该出现还出现。成了顽疾了。这不,我在stackoverflow 上看到一个帖子写了一个解决办法,如获至宝,然后添加实行。

首先在继承AuthorizeAttribute 的类的protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 方法中增加了几行代码。


 

 protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {

            base.HandleUnauthorizedRequest(filterContext);

            #region solution server cannot set status after http headers have been sent
            var ctx = filterContext.HttpContext;
            //If you are using .NET 4.5 +, add this line before Response.StatusCode
            filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
            ctx.Response.StatusCode = (int)HttpStatusCode.Forbidden;
            ctx.Response.End();
            #endregion

        }

第二个,在global.asax 中的 Application_BeginRequest 增加了两行代码:

 protected void Application_BeginRequest(object sender, EventArgs e)
        {
            Response.Clear();
            // Buffer response so that page is sent
            // after processing is complete.
            Response.BufferOutput = true;
        }

加上后观察了一天,仍然有 服务器无法在已发送 HTTP 标头之后设置状态这样的错误提示,看来不起作用啊。由于没有其他影响,这些代码虽然不起作用,但是并没有删除。而过了几天,我在做页面测试的时候,突然发现,当无权限的时候,页面会出现空白,没有任何提示。而原来设置的是当无权限操作该页面的时候,跳转到无权限提示页面。当时觉得可能是浏览器新添加的安全功能。没多久,公司的同事也反应过来了这种问题,感觉这样操作很不方便。我才终于重视其这个问题。由于没权限的时候一片空白。我用fiddler 抓包软件进行测试。发觉访问此页面的时候报的是403 禁止访问。这时我才意识到,这恐怕不是浏览器新增加了安全功能,而有可能是我新添加的代码导致的问题。先禁用了global.asax 中的 Application_BeginRequest 中的两行代码,问题依旧。不是这里的问题。然后禁用继承AuthorizeAttribute 的 HandleUnauthorizedRequest 方法中的几行代码。这时,跳转到无权限页面正常了。这时在分析这几行代码 HttpStatusCode.Forbidden ,这不就是403禁止访问吗。看来这个stackoverflow 的解决方案并不适合我这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 跨域访问是指在浏览器中,通过JavaScript代码从一个域名的网页去请求另一个域名的资源时,会被同源策略所限制而无法正常访问。为了解决这个问题,我们需要通过设置HTTP响应标头来允许跨域访问。 在HTTP响应中,我们可以设置一些特殊的标头,如"Access-Control-Allow-Origin"、"Access-Control-Allow-Methods"、"Access-Control-Allow-Headers"等来控制在跨域请求时的行为。 "Access-Control-Allow-Origin"标头用于指定允许访问该资源的域,可以设置为具体的域名或通配符"*",表示允许任何域进行访问。 "Access-Control-Allow-Methods"标头用于指定允许的请求方法,如GET、POST、PUT等。 "Access-Control-Allow-Headers"标头用于指定允许的请求头,如Content-Type、Authorization等。 除了以上标头,还可以使用其他一些标头来进一步控制跨域请求。此外,在前端代码中,还需要使用XMLHttpRequest对象或Fetch API发送请求时,设置"withCredentials"为true,并在后端服务器中作出相应的处理,允许发送带有身份凭证的跨域请求。 需要注意的是,在设置跨域访问的时候,应该明确指定允许访问的域名,避免未经授权的域名访问可能引发的安全问题。 通过设置HTTP响应标头,我们可以解决跨域访问的问题,实现不同域名之间的数据交互与资源共享。 ### 回答2: 跨域访问是指在Web开发中,浏览器执行JavaScript代码请求不同源的资源时,由于浏览器的同源策略限制,会导致请求失败。为了实现跨域访问,我们需要在服务器设置HTTP响应标头。 常见的跨域访问解决方案是使用CORS(跨域资源共享)。在服务器设置CORS标头,允许特定的源发起跨域请求。通过设置标头中的"Access-Control-Allow-Origin"字段,可以指定允许请求的源。例如,设置为"*"表示允许任何源发起请求。 另一个常见的解决方案是使用JSONP(JSON with Padding)。JSONP利用了script标签不受同源策略限制的特性。通过在服务器端返回一个回调函数的调用,将数据作为参数传递给回调函数,实现跨域数据的获取。 除了CORS和JSONP,还可以使用代理服务器解决跨域访问问题。在客户端发送请求时,将请求发送至代理服务器,然后代理服务器再将请求转发至目标服务器,并将响应返回给客户端。这种方式绕过了浏览器的同源策略限制。 在设置HTTP响应标头的时候,需要注意安全性的考虑。过于宽松的设置可能导致跨域攻击。因此,我们应该根据需求明确允许的来源,并考虑设置其他相关的CORS标头字段,比如"Access-Control-Allow-Methods"和"Access-Control-Allow-Headers"等。 总之,跨域访问需要通过在服务器设置HTTP响应标头解决限制问题。CORS、JSONP和代理服务器是常见的实现跨域访问的解决方案。合理设置标头字段可以确保安全性和功能的平衡。 ### 回答3: 跨域访问是指在Web开发中,浏览器中运行的一个网页,向另一个域名下的资源发起请求,但是由于浏览器的同源策略限制,跨域请求是被禁止的。为了解决这个问题,需要在服务器http响应标头中进行设置。 首先,服务器需要在响应中设置Access-Control-Allow-Origin标头,该标头指定了被允许进行跨域访问的原始域名。可以设置为"*"表示允许来自所有域名的访问,也可以设定为特定的域名,例如"www.example.com"。 其次,服务器还可以设置其他的Access-Control-Allow-*标头,来进一步控制跨域请求的细节。例如,Access-Control-Allow-Methods标头可以指定允许的HTTP方法,Access-Control-Allow-Headers标头可以指定允许的HTTP头,Access-Control-Max-Age标头可以设定预检请求的有效期等。 此外,如果在跨域请求中使用了携带身份凭证的cookie,还需要设置Access-Control-Allow-Credentials标头为true,以允许携带凭证。 综上所述,跨域访问需要在服务器http响应标头设置相关的Access-Control-*标头,以允许来自其他域名的请求访问服务器的资源。通过设置合适的标头,就可以在一定程度上解决跨域访问的限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值