LSJ_NHibernate第四章 MVC

前言:

  MVC现在已经成为web开发的一个主流趋势了,还没用过的小伙伴,你们已经落伍了,这里我推荐一篇学习博客 玩转Asp.net MVC 的八个扩展点  代码完全开源,下载地址:https://git.oschina.net/tibos/LSJ_NHibernate

Global 全局应用程序处理的入口,在这个里面可以干很多事,比如把一些公共的东西绑定进去,这里不知不觉就用到一个知识,面向切面编程AOP

最常用的,我们把验证用户身份,记录用户操作信息....这些记为横切关注点,我们进行每个操作的时候都要验证用户凭证是否失效,干了些什么事,如果每个请求都写,代码就冗余了,也不便于后期的维护,我们提取成横切关注点后,只用写一遍代码就能轻松实现了.

为此,MVC给我们提供了很好的拓展,我们重新ActionFilterAttribute里面的方法即可

我们重写这4个方法即可

1         // OnActionExecuted 在执行操作方法后由 ASP.NET MVC 框架调用。
2         // OnActionExecuting 在执行操作方法之前由 ASP.NET MVC 框架调用。
3         // OnResultExecuted 在执行操作结果后由 ASP.NET MVC 框架调用。
4         // OnResultExecuting 在执行操作结果之前由 ASP.NET MVC 框架调用。

用Log4net记录这些请求

顺便也可以记录到数据库,做操作日志

保存用户凭证我用的是forms表单验证,MVC默认是支持的,设置起来也非常简单

1     <authentication mode="Forms">
2       <forms loginUrl="~/Home/Login" timeout="2880" />
3     </authentication>
4     <authorization>
5       <deny users="?" />
6     </authorization>

设置成没有登入的用户不能访问,在Global将事件注册到mvc

 1 public MvcApplication()
 2         {
 3             AuthorizeRequest += new EventHandler(MvcApplication_AuthorizeRequest);
 4         }
 5 
 6         void MvcApplication_AuthorizeRequest(object sender, EventArgs e)
 7         {
 8             IIdentity id = Context.User.Identity;
 9             if (id.IsAuthenticated)
10             {
11 
12                 var roles = new DAO.BLL.B_Manager().GetRoles(id.Name);
13                 Context.User = new GenericPrincipal(id, roles);
14             }
15         }

这样进行所有的操作,forms都会验证用户是否登录,再结合OnActionExecuting进行权限验证,没有权限的就直接返回一个空视图即可!

用forms保存凭证的要注意一点,对于没有登录的用户,项目下的所有资源都无法访问,如js,img....所以这里必须将不需要验证的文件开放访问权限,在配置文件里设置,如下

1  <!--这些资源是不用权限判断的-->
2   <location path="img">
3     <system.web>
4       <authorization>
5         <allow users="*" />
6       </authorization>
7     </system.web>
8   </location>

 最后一个需要捕获的就是错误日志,重写HandleErrorAttribute方法即可

 1     /// <summary>
 2     /// 捕获程序出错日志
 3     /// </summary>
 4     public class Log4NetExceptionFilter : HandleErrorAttribute
 5     {
 6 
 7         public override void OnException(ExceptionContext filterContext)
 8         {
 9             string message = string.Format("消息类型:{0}<br>消息内容:{1}<br>引发异常的方法:{2}<br>引发异常源:{3}"
10                   , filterContext.Exception.GetType().Name
11                   , filterContext.Exception.Message
12                    , filterContext.Exception.TargetSite
13                    , filterContext.Exception.Source + filterContext.Exception.StackTrace
14                    );
15 
16             //记录日志
17             CZLogger.Logger.Error(message);
18 
19             //抛出异常信息
20             filterContext.Controller.TempData["ExceptionAttributeMessages"] = message;
21 
22             //转向
23             filterContext.ExceptionHandled = true;
24             filterContext.Result = new RedirectResult("/Home/Error/");
25         }
26     }

将记录错误日志方法写入RegisterGlobalFilters即可.

 

posted @ 2016-12-20 16:07  提伯斯  阅读(651)  评论(0编辑  收藏  举报