【问题标题】:Encoding / Encryption in IHttpHandler UrlsIHttpHandler Urls 中的编码/加密
【发布时间】:2015-02-25 12:44:21
【问题描述】:

我使用IHttpHandlerdatabase 获取数据以进行过滤。但是,我遇到了一些过滤器值的问题,这些过滤器值包含"&""/" 等特殊字符。

如何将这些带有特殊字符的过滤器值传递给处理请求?

更新

 function filter_Click(element_clicked) {
 var colName = $(element_clicked).attr("data-id");
     $.ajax({

        type: "GET",
        url: "../../Handlers/FilterValueHandler.ashx?ColumnName=" + colName + "&filter_text=" + $('#hndSelectedValue').val(),
        processData: false,
        contentType: "application/json; charset=utf-8",
        dataType: "json",

        success: function (response) {}
});
}

在上面的代码中$('#hndSelectedValue').val() 是一个隐藏元素,其值用于过滤器,我必须将其发送到服务器进行过滤。 JSON format中的这个值。

如何将这些带有特殊字符的过滤器值传递给处理请求?

【问题讨论】:

  • 您想从哪里传递这些过滤器值?你能举个具体的例子吗?
  • @tyger 我正在使用“来自 javascript 函数的 ajax 调用”来调用该 IHttpHandler。此 ajax 调用的参数具有特殊字符,如“&”、“/”等。
  • @tyger 请检查我的更新

标签: c# asp.net-mvc encryption encoding urlencode


【解决方案1】:

您可以使用标准 JavaScript 函数 encodeURIComponent() 对您的值进行编码,以将其作为 URL 中的 GET 参数传递

//skipped
url: "../../Handlers/FilterValueHandler.ashx?ColumnName=" + colName + "&filter_text=" + encodeURIComponent($('#hndSelectedValue').val()),

稍后在您的服务器代码中使用System.Uri.UnescapeDataString() 方法将其解码回来。

var decodedValue = System.Uri.UnescapeDataString(Request.QueryString["filter_text"]);

另外见URL Encode a string in jQuery for an AJAX request
How do I decode HTML that was encoded in JS using encodeURIComponent()?

【讨论】:

  • 好的@tyger 我会接受你的建议,谢谢你
  • 由于 URL 长度(请求的 URI 太长),我在使用相同的过滤器时遇到了其他问题。有什么建议吗?
  • 嗯,那你的过滤器有多长?似乎它必须作为 POST 参数而不是 GET 发送到服务器端。见jQuery.ajax reference。 cmets中的格式存在问题,请参阅我的下一个答案。最好就这个问题提出另一个问题。
【解决方案2】:

已解决

**在javascript中

function EncryptText(toEcode) {
    var Key = CryptoJS.enc.Utf8.parse("AMINHAKEYTEM32NYTES1234567891234");
    var IV = CryptoJS.enc.Utf8.parse("7061737323313233");
    var encryptedText = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(toEcode), Key, {keySize: 128 / 8, iv: IV, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
    return encryptedText;
}

** 在 C# 代码中

 public static String AES_decrypt(string encrypted)
    {
        encrypted = encrypted.Replace(' ', '+');// This line resolved my Issue
        var Key = Encoding.UTF8.GetBytes("AMINHAKEYTEM32NYTES1234567891234");
        var IV = Encoding.UTF8.GetBytes("7061737323313233");
        byte[] encryptedBytes = Convert.FromBase64String(encrypted);
        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        aes.BlockSize = 128;
        aes.KeySize = 256;
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.PKCS7;
        aes.Key = Key;
        aes.IV = IV;
        ICryptoTransform crypto = aes.CreateDecryptor(aes.Key, aes.IV);
        byte[] secret = crypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
        crypto.Dispose();
        return System.Text.ASCIIEncoding.ASCII.GetString(secret);
    }

【讨论】:

  • 哇,哇,慢点,你不能使用加密技术对带有特殊符号的值进行编码和解码 - 这对双方的计算机资源来说都太昂贵了:客户端和服务器。这是不好的方式。看我上面的回答。
【解决方案3】:

将长值作为 POST 请求传递给服务器的 Ajax 请求:

$.ajax({
    type: "POST",
    url: "../../Handlers/FilterValueHandler.ashx?ColumnName=" + colName,
    data: {"filter_text":$('#hndSelectedValue').val()},
    success: function (response) {}
});

更新:

在服务器端使用Request.Form["filter_text"]从请求中获取它

【讨论】:

  • 我在处理程序 ProcessRequest() 方法中收到“值不能为空”错误消息,我们从请求中进行过滤测试,代码:- var filter_text = System.Uri.UnescapeDataString( context.Request.QueryString["filter_text"]);
  • @JKANNAN 在这种情况下,你必须使用context.Request.Form["filter_text"] 来获得你的价值。
  • 尝试在你的浏览器中使用开发者工具,比如网络,看看实际上发送到服务器的是什么。
猜你喜欢
  • 2021-11-20
  • 2011-02-19
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
相关资源
最近更新 更多