標籤:
查看某個資訊的時候一般會在url上加上該資訊在資料庫中對應的主鍵id(而且一般是自增的)
url是這樣子的 xxxDetail/1 , 雖然對於我們開發人員來說可以這種顯式的資料庫主鍵會方便調試過程,但是這種url的安全性比較低
所以想將這類id給加密了, 當然也不想在需要此處理的地方 添加上加密或解密的代碼;
基於mvc的路由機制我們可以很方便的將 輸出的url和輸入的url參數進行自動的加密和解密:
一、通過擴充UrlHelper方法, 對參數進行加密
1 public static class UrlExtensions 2 { 3 /// <summary> 4 /// UrlHelper擴充方法 5 /// </summary> 6 /// <param name="helper"></param> 7 /// <param name="id">需要進行加密的參數</param> 8 /// <returns></returns> 9 public static string RouteEncodedParameter(this UrlHelper helper, string id)10 {11 //將參數進行加密(在參數前面加"aa") 12 id = "aa" + id;13 return helper.RouteUrl("default", new { id = id });14 }15 }
二、通過實現IRouteHandler介面的GetHttpHandler方法, 截取RequestContext將其中的參數進行解密後繼續傳遞給MvcHandler處理
1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 6 // 預設值 7 RouteValueDictionary defaults = new RouteValueDictionary(); 8 defaults.Add("controller", "Home"); 9 defaults.Add("action", "Index");10 defaults.Add("id", "aa11"); 11 12 // 註冊路由,並指定自訂的路由處理器13 routes.Add("default", new Route("{controller}/{action}/{id}"14 , defaults15 , new GetEncodedIdRouteHandler()));16 17 }18 }19 20 /// <summary>21 /// 在路由處理器中修改參數值22 /// </summary>23 public class GetEncodedIdRouteHandler : IRouteHandler24 {25 public IHttpHandler GetHttpHandler(RequestContext requestContext)26 {27 // 在這裡可以對參數解密28 // 這裡只是將開頭的aa給去除29 string id = requestContext.RouteData.Values["id"] == null ? "" : requestContext.RouteData.Values["id"].ToString().TrimStart(‘a‘);30 requestContext.RouteData.Values["id"] = id;31 return new MvcHandler(requestContext);32 }33 }
以上,我們就圍繞asp.net的路由機制, 對路由參數進行了加密和解密操作; 然後action裡邊的參數擷取的就是真實的資料庫主鍵了
如下 @Url.RouteEncodedParameter("2") 產生的url ,在action中擷取的就直接是解密後的真實參數了
ps: 解密的切入口 個人覺得只要是在action的模型繫結之前, 都是可以的
源碼下載
mvc url路由參數的加密和解密