zoukankan      html  css  js  c++  java
  • C# Attribute应用:类签名

    在应用别人接口的时候,总是要用签名,很是不理解签名这是怎么知道做的。通过对Attribute的学习了解。大体可以用Attribute来做签名应用。

    具体过程如下:

    首先我们要先定义一个类,该类继承Attribute。该类主要最用是,签名需要用到的方法、参数和获取加密文件

     1  public class CashiSongAttribute : Attribute
     2     {
     3         /// <summary>
     4         /// 签名参数
     5         /// </summary>
     6         public string[] Param { get; set; }
     7         /// <summary>
     8         /// 是否签名
     9         /// </summary>
    10         public bool IsSign { get; set; }
    11         /// <summary>
    12         /// 加密文件
    13         /// </summary>
    14         /// <param name="bp"></param>
    15         /// <param name="mi"></param>
    16         /// <returns></returns>
    17         public string ParamEncryption(BasePage bp,System.Reflection.MethodInfo mi)
    18         {
    19             if (Param != null && Param.Length > 0)
    20             {
    21                 string md5 = "op" + mi.Name.ToLower();
    22                 foreach (string item in Param)
    23                 {
    24                     if (item.ToLower() == "op" || item.ToLower() == "sign")
    25                         continue;
    26                     md5 += item + bp.GetRequest(item);
    27                 }
    28                 byte[] bytestr = Encoding.Default.GetBytes(md5);
    29                 MD5 _md5 = new MD5CryptoServiceProvider();
    30                 byte[] bytesend = _md5.ComputeHash(bytestr);
    31                 return BitConverter.ToString(bytesend).Replace("-", "");
    32             }
    33             return "";
    34         }
    35     }
    View Code

    新建一个页面,在该页面创建一个方法,并加入该特性

    1         [CashiSong(IsSign = true, Param = new string[] { "op", "name" })]
    2         public string getceshicon()
    3         {
    4             return "签名成功!";
    5         }

    下面关键就再也通过调用方式的时候,验证参数是否都符合,加密文件是否正确。

    创建一个基类BasePage,该基类主要负责,接受参数,并指定参数指定的方法,并判断签名信息是否正确。

    这里会用到:System.Reflection.MethodInfo的应用、获取特性Attribute参数内容。

      public class BasePage : Page
        {
            public BasePage()
            {
                this.Load += new EventHandler(BasePage_Load);
            }
    
            void BasePage_Load(object sender, EventArgs e)
            {
                Response.AddHeader("Accept-Charset","UTF-8");
                string op = GetRequest("op");
                if (!string.IsNullOrEmpty(op))
                {
                    System.Reflection.MethodInfo mi = this.GetType().GetMethod(op);
                    Attribute_Jude(mi);
                }
                this.Response.End();
            }
            /// <summary>
            /// 签名判断
            /// </summary>
            /// <param name="mi"></param>
            public void Attribute_Jude(MethodInfo mi)
            {
                MsgModel Msg = new MsgModel();
                if (mi.IsDefined(typeof(CashiSongAttribute), false))
                {
                    object[] attrs = mi.GetCustomAttributes(typeof(CashiSongAttribute), false);
                    CashiSongAttribute iplimit = (CashiSongAttribute)attrs[0];
                    object responsestr=null;
                    if (iplimit != null && iplimit.Param.Length > 0)
                    {
                        string server_sign = GetRequest("sign");
                        string client_sign = iplimit.ParamEncryption(this, mi);
                        if (!server_sign.Equals(client_sign, StringComparison.OrdinalIgnoreCase)&&iplimit.IsSign)
                        {
                            Msg.msg = "Sing Error";
                            Msg.toile = 0;
                            Send(Msg);
                            return;
                        }
                        responsestr = mi.Invoke(this, null);
                    }
                    Msg.toile = 1;
                    Msg.msg = responsestr.ToString();
                    Send(Msg);
                }
            }
            public void Send(MsgModel Msg)
            {
                Response.AddHeader("Content-type","applictaion/json");
                JavaScriptSerializer javaScript = new JavaScriptSerializer();
                string Con = javaScript.Serialize(Msg);
                Response.Write(Con);
            }
            public string GetRequest(string key)
            {
                if (Request.QueryString[key] == null)
                    return "";
                else
                    return Request.QueryString[key];
            }
        }
    
        public class MsgModel
        {
            public string msg { get; set; }
            public int toile { get; set; }
        }

    获取特性参数内容的方法(CashiSongAttribute 为自定义特性类)

     if (mi.IsDefined(typeof(CashiSongAttribute), false))
                {
                    object[] attrs = mi.GetCustomAttributes(typeof(CashiSongAttribute), false);
                    CashiSongAttribute iplimit = (CashiSongAttribute)attrs[0];
                }
  • 相关阅读:
    LeetCode(6. Z 字形变换)
    二分查找
    线性查找
    平安寿险Java面试-社招-四面(2019/08)
    希尔排序
    中移物联网Java面试-社招-三面(2019/07)
    插入排序
    选择排序
    冒泡排序
    八皇后问题
  • 原文地址:https://www.cnblogs.com/xiao-bei/p/4673790.html
Copyright © 2011-2022 走看看