在写用户验证特性的时候照搬了一段网上的代码,把自己坑了两小时
1 public class RequireLoginAttribute : AuthorizeAttribute 2 { 3 protected override bool AuthorizeCore(HttpContextBase httpContext) 4 { 5 bool Pass = false; 6 if (!CheckUserIsLogin()) 7 { 8 httpContext.Response.StatusCode = 401;//无权限状态码 9 } 10 else 11 { 12 Pass = true; 13 } 14 15 return Pass; 16 } 17 protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 18 { 19 base.HandleUnauthorizedRequest(filterContext); 20 if (filterContext.HttpContext.Response.StatusCode == 401) 21 { 22 if (filterContext.HttpContext.Request.HttpMethod.Equals("GET")) 23 filterContext.Result = new RedirectResult("~/Member/Login", true); 24 else 25 { 26 var script = "Poplogin()"; 27 filterContext.Result = new JavaScriptResult() { Script = script }; 28 } 29 } 30 } 31 32 private bool CheckUserIsLogin() 33 { 34 string logintoken = CookieHelper.GetCookie(CookieKey.LoginToken); 35 if (string.IsNullOrEmpty(logintoken)) return false; 36 var _member = shopMemberBll.GetMemberByToken(logintoken); 37 if (_member == null || SessionHelper.GetSessionUserView().MemCode != _member.memCode) return false; 38 return true; 39 } 40 }
看似好像没什么问题,问题出在:
filterContext.Result = new RedirectResult("~/Member/Login", false);
因为RedirectResult第二个参数代表是否永久重定向
导致浏览器缓存了重定向结果
导致我在后来Action上移除特性,还是没法访问该方法,而且连断点也进不了。
一开始怀疑是我代码写的问题,但是后来发现是和路由有关,查了一通百度没有任何提示。
后来猜想可能和IIS对路由的缓存有关,因为同样访问Index页,两种路由访问,一个被重定向,另一个没有。
最后,我把重定向的代码重看了一遍,发现RedirectResult和我平时的写法不一样才发现错误。
下次抄代码一定得仔细点啊!!!