zoukankan      html  css  js  c++  java
  • 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的模型绑定之前, 都是可以的

    源码下载

  • 相关阅读:
    基于Docker的Mysql主从复制搭建
    Docker操作命令——查看、停止、删除容器
    Git命令
    未定义数组下标: 0
    zookeeper-3.4.14单机多端口集群搭建
    使用MAT分析dump文件定位程序问题
    intellij idea2019.1中文破解版安装
    vscode打造golang开发环境
    python项目开发环境模块安装记录
    shell用法
  • 原文地址:https://www.cnblogs.com/mushishi/p/4281448.html
Copyright © 2011-2022 走看看