2017年12月21日

2017/12/21 posted in  码农日志
  1. 判断文件的文件夹是否存在,不存在就创建
  2. 404页面加上状态码
  3. 前端加密+MVC后端解密

判断文件的文件夹是否存在,不存在就创建

今天遇到一个项目,利用 SharpZipLib 解压文件时,由于没有按照目录层级一个一个去遍历,导致文件的文件夹没有创建报错。加上这段代码可以判断文件地址的文件夹有没有创建,没创建就创建。

FileInfo fileInfo = new FileInfo(fileName);
if (fileInfo.Directory != null && !fileInfo.Directory.Exists)
{
    fileInfo.Directory.Create();
}

404页面加上状态码

Response.StatusCode = 404;

前端加密+MVC后端解密

前端JS加密使用的是 crypto-js 一个JS加密解密的库

基本流程:
1、利用MVC筛选器,在需要加密提交数据的Action页面添加加密用到的Key。这样可以每次请求页面都生成不同的加密Key

public class DecryptAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        CookieHelper.UpdateCookie("DecryptKey", Guid.NewGuid().ToString(), false, DateTime.MinValue);
        CookieHelper.UpdateCookie("DecryptIv", Guid.NewGuid().ToString(), false, DateTime.MinValue);
    }
}

2、前端获取Cookie加密Key,加密数据

var key = CryptoJS.MD5(CryptoJS.enc.Utf8.parse(Cookies.get("DecryptKey"))); 
var iv = CryptoJS.MD5(CryptoJS.enc.Utf8.parse(Cookies.get("DecryptIv"))); 

{
    UserName: CryptoJS.AES.encrypt(userName, key, { iv: iv}).toString(),
    Password: CryptoJS.AES.encrypt(password, key, { iv: iv }).toString()
}

3、利用筛选器给需要解密的字段解密

public class EncryptAttribute : ValidationAttribute, IMetadataAware
{
    private readonly string _fieldName;
    public EncryptAttribute(string fieldName)
    {
        _fieldName = fieldName;
    }

    /// <summary>
    ///     验证实体属性
    /// </summary>
    /// <param name="value"></param>
    /// <param name="validationContext"></param>
    /// <returns></returns>
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (!string.IsNullOrEmpty(_fieldName) && value.ToStr().IsNotEmpty())
        {
            string val = DESCrypt.AesDecryptBase64(value.ToStr(), CookieHelper.GetCookie("DecryptKey"), CookieHelper.GetCookie("DecryptIv"));
                PropertyInfo pi = validationContext.ObjectType.GetProperty(_fieldName,
                    BindingFlags.Public | BindingFlags.Instance);
            if (pi != null) pi.SetValue(validationContext.ObjectInstance, val, null);
        }

        return ValidationResult.Success;
    }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.RequestValidationEnabled = false;
    }
}
public class UserLogin
{
    [Display(Name = @"用户名")]
    [Required(ErrorMessage = @"请输入登录名")]
    [Encrypt("UserName")]
    public string UserName { get; set; }

    [Display(Name = @"密码")]
    [Required(ErrorMessage = @"请输入密码")]
    [Encrypt("Password")]
    public string Password { get; set; }
}