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即可.