• mvc url路由参数的加密和解密


       查看某个信息的时候一般会在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中获取的就直接是解密后的真实参数了

    ps: 解密的切入口 个人觉得只要是在action的模型绑定之前, 都是可以的

    源码下载

  • 相关阅读:
    leetcode 131. Palindrome Partitioning
    leetcode 526. Beautiful Arrangement
    poj 1852 Ants
    leetcode 1219. Path with Maximum Gold
    leetcode 66. Plus One
    leetcode 43. Multiply Strings
    pytorch中torch.narrow()函数
    pytorch中的torch.repeat()函数与numpy.tile()
    leetcode 1051. Height Checker
    leetcode 561. Array Partition I
  • 原文地址:https://www.cnblogs.com/mushishi/p/4281448.html
Copyright © 2020-2023  润新知