MVC5 关于路由的坑

在写用户验证特性的时候照搬了一段网上的代码,把自己坑了两小时

 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     }
View Code

看似好像没什么问题,问题出在:

filterContext.Result = new RedirectResult("~/Member/Login", false);

因为RedirectResult第二个参数代表是否永久重定向

导致浏览器缓存了重定向结果

导致我在后来Action上移除特性,还是没法访问该方法,而且连断点也进不了。

一开始怀疑是我代码写的问题,但是后来发现是和路由有关,查了一通百度没有任何提示。

后来猜想可能和IIS对路由的缓存有关,因为同样访问Index页,两种路由访问,一个被重定向,另一个没有。

最后,我把重定向的代码重看了一遍,发现RedirectResult和我平时的写法不一样才发现错误。

 

下次抄代码一定得仔细点啊!!!

posted @ 2016-07-18 17:03  EnPFighter  阅读(722)  评论(0编辑  收藏  举报