原文:https://www.cnblogs.com/Locked-J/p/7700070.html

笔记:

可以在权限验证的时候判断是不是ajax请求,如果是,就返回status 0,然后页面去处理,如果不是 就redirect


【Ajax Asp.Net】Ajax跨域重定向302及错误回调 、MVC身份验证过滤器

一、身份验证拦截,Ajax请求跨域重定向到页面后不加载,场景分析

关键字:身份验证拦截Ajax跨域重定向302

业务场景

目前项目需要使用公司的OAuth身份验证平台做单点登录(Single Sign On,SSO),于是要在目前的MVC项目中添加身份验证相关的业务逻辑,项目中大量表格展示数据,使用了很多Ajax。我对项目大部分请求做了身份验证,Ajax请求也要拦截。

问题

对未登录用户发起的的Ajax请求,返回重定向的登录页,但是实际页面并不会加载得到的登录页面。

分析

Ajax本就为页面局部刷新修改而做的,返回的页面只会被当做返回的普通数据。
在过滤器中身份验证未通过后,请求被重定向(302)了项目的login方法,然后根据项目信息重定向(302)到认证平台的对应登录页面(200),浏览器拦截跨域请求资源,此时返回给Ajax的Http状态码为0(就是没有返回状态码的情况)。于是,需要针对返回到Ajax的状态码为0时,做处理。

处理方法

在全局js中添加Ajax的请求错误回调设置方法(还有其他方法ajaxComplete之类的,见W3CSchool)

/*ajax请求失败回调默认方法*/
$(document).ajaxError(function (event,xhr,options,exc) {
    if (xhr.status === 0) {
        window.location.reload();    // 强制刷新页面
    }
    else if (xhr.status === 302) {
        console.log(xhr);
    }
    if (xhr.status === 404) {
        if (xhr.status === 500) {
        console.log(xhr);
    }
});

小结

这里暂时处理,返回状态码0的时候直接强制刷新页面,然后对页面刷新的身份验证拦截重定向到登录页。
考虑修改,验证请求类型为Ajax请求时,身份验证失败直接返回失败响应状态码,并使用Js直接重定向到登录页面,省去无效重定向。

续:

使用Request.IsAjaxRequest();可以判断请求类型,然后就方便处理了。

二、MVC自定义动态错误页面后,Ajax错误回调方法接收不到对应状态码

关键字:http状态码

业务场景

MVC项目的错误页面自定义(即通过控制器获取Razor视图而不是HTML静态页面)后,Ajax的请求接收到Http状态码只有200的情况。
(静态的页面,MVC可以在Web.config中配置状态码)

分析

错误被拦截后,动态重定向到指定控制器方法后,正常返回页面,所以状态码是200。

处理方法

Response.StatusCode = 500;
控制器对应方法返回动态的错误页面时,先修改响应状态码,然后Ajax就可以收到错误了,可以像上面一个问题里拦截回调处理,做提示一下之类的操作。

总结

写完发现都是小问题。扶额。(╯‵□′)╯︵┻━┻。好菜。

MVC身份验证过滤器

类似下面的,过滤器主要进行身份验证,跳转SSO的认证平台及存储获取的令牌等操作由/login进行,不在此记录。

using System.Web;
using System.Web.Mvc;

namespace Filter
{
    /// <summary>
    /// 身份验证过滤器
    /// 使用方法:[CustAuthorize]特性
    /// 1.特性可以使用在Class和Method上,Class上表示内部所有方法需要验证
    /// 2.可以Class上[CustAuthorize]并在不需要验证的方法上[AllowAnonymous]
    /// </summary>
    public class CustAuthorizeAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// 请求的地址
        /// </summary>
        private string requestUrl { get; set; }

        /// <summary>
        /// 请求授权时执行
        /// </summary>
        override void OnAuthorization(AuthorizationContext filterContext) {
            base.OnAuthorization(filterContext);   //进入AuthorizeCore
        }

        /// <summary>
        /// 自定义授权检查(返回False则授权失败)
        /// </summary>
        protected bool AuthorizeCore(HttpContextBase httpContext) {
            if (httpContext.Session["tk"] != null && !string.IsNullOrEmpty(httpContext.Session["tk"].ToString()))
            {
                string tk = httpContext.Session["tk"].ToString();    // 令牌,获取到以后存在Session了,
                bool check = Check.check(tk);    // 验证方法
                if (check)
                    return true;
            }
            httpContext.Session["tk"] = null;
            false;     // 进入HandleUnauthorizedRequest 
        }

        /// <summary>
        /// 处理授权失败的HTTP请求
        /// </summary>
        HandleUnauthorizedRequest(AuthorizationContext filterContext) {
            if (filterContext.HttpContext.Request.IsAjaxRequest())  // ajax请求
            {
                filterContext.HttpContext.Response.StatusCode = 302;
                var json = JsonConvert.SerializeObject(new { state = "0",message = "权限验证失败!请重新登录" });
                filterContext.HttpContext.Response.Write(json);
                filterContext.HttpContext.Response.End();
            }
            else // 未登录请求页面地址
            {
                filterContext.HttpContext.Session["requestUrl"] = filterContext.HttpContext.Request.Url.AbsolutePath;
                // 重定向到登录
                filterContext.Result = new RedirectResult("/login");
            }
        }
    }
}

身份验证拦截,Ajax请求跨域重定向到页面后不加载,场景分析的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

    解决方法如果您仍在寻找解决方案,请参阅以下内容:

  3. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  4. ios – 将iphone应用程序重定向到苹果商店

    我有一个iPhone应用程序,当有可用的升级时,我想提示用户升级,如果他们点击升级,我想将它们重定向到苹果商店.这是怎么做到的?

  5. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

  6. ios – Oauth突然无法使用iphone(仅安装了FS应用程序)

    我们的iPhone应用程序允许通过oauth通过Foursquare登录.它工作正常,最近停止工作.我们得到的错误是:连接失败:回调uri对此使用者无效.但是,如果用户没有在手机上安装foursquare应用程序,它可以像以前一样正常工作.似乎FS现在正在进行重定向来处理FS应用程序内部的oauth,并且在尝试返回到原始应用程序时失败.通过野生动物园它似乎工作.这是在ios9上.解决方案?

  7. ios – 以http无效的自定义URL方案开头

    我在应用程序中使用了自定义URL方案.我成功地从safari重定向到我的应用程序.就像我已经制作了URL方案“appname”.请检查http://prntscr.com/2cjx0p.我需要使用像iosurlredirectfrommailtoapp这样的解决方案,但我不确定如何设置cookie.我发现我必须首先在我的应用程序中为服务器“http://myappname.com”设置一个cook

  8. ios – NSURLProtocol的抽象方法

    我一直在我的应用程序中使用自定义NSURLProtocol来检测资源并从缓存目录加载(如果可用),或重定向回我的应用程序的服务器.但是,我发现缺少抽象方法的文档,我不知道如何处理我们需要实现的一些抽象方法.我们必须实施:canInitWithRequest很简单,这就是告诉NSURLProtocol您将响应此请求的方式.我不知道如何处理canonicalRequestForRequest:在sta

  9. ios – 如何将视频从AVAssetExportSession保存到相机胶卷?

    在此先感谢您的帮助.解决方法只需使用session.outputURL=…

  10. ios – 使用AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto拉伸捕获的照片

    解决方法所以我解决了我的问题.这是我现在使用的代码,它工作正常:…重要的输出imagaView:一些额外的信息:相机图层必须是全屏,并且outputimageView也必须是.我希望这些对某些人来说也是有用的信息.

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部