LSJ_NHibernate第四章 MVC 玩轉Asp.net MVC 的八個擴展點

前言:html

  MVC如今已經成爲web開發的一個主流趨勢了,還沒用過的小夥伴,大家已經落伍了,這裏我推薦一篇學習博客 玩轉Asp.net MVC 的八個擴展點  代碼徹底開源,下載地址:https://git.oschina.net/tibos/LSJ_NHibernategit

Global 全局應用程序處理的入口,在這個裏面能夠幹不少事,好比把一些公共的東西綁定進去,這裏不知不覺就用到一個知識,面向切面編程AOPweb

最經常使用的,咱們把驗證用戶身份,記錄用戶操做信息....這些記爲橫切關注點,咱們進行每一個操做的時候都要驗證用戶憑證是否失效,幹了些什麼事,若是每一個請求都寫,代碼就冗餘了,也不便於後期的維護,咱們提取成橫切關注點後,只用寫一遍代碼就能輕鬆實現了.數據庫

爲此,MVC給咱們提供了很好的拓展,咱們從新ActionFilterAttribute裏面的方法便可編程

咱們重寫這4個方法便可mvc

1         // OnActionExecuted 在執行操做方法後由 ASP.NET MVC 框架調用。
2         // OnActionExecuting 在執行操做方法以前由 ASP.NET MVC 框架調用。
3         // OnResultExecuted 在執行操做結果後由 ASP.NET MVC 框架調用。
4         // OnResultExecuting 在執行操做結果以前由 ASP.NET MVC 框架調用。

用Log4net記錄這些請求框架

順便也能夠記錄到數據庫,作操做日誌ide

保存用戶憑證我用的是forms表單驗證,MVC默認是支持的,設置起來也很是簡單post

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

相關文章
相關標籤/搜索