查看某个信息的时候一般会在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 , defaults 15 , new GetEncodedIdRouteHandler())); 16 17 } 18 } 19 20 /// <summary> 21 /// 在路由处理器中修改参数值 22 /// </summary> 23 public class GetEncodedIdRouteHandler : IRouteHandler 24 { 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中获取的就直接是解密后的真实参数了