Символ + из QueryString не отображается при применении к переменной сеанса - PullRequest
0 голосов
/ 02 ноября 2019

У меня проблема в том, что я пытаюсь обновить пароль на основе адреса электронной почты, полученного из строки запроса. Мне нужно поместить значение строки запроса в переменную сеанса из-за некоторых других сценариев. Все отлично работает со стандартным адресом электронной почты: bob@outlook.com, но если я использую символ «+» в адресе электронной почты, такой как bob+1@outlook.com, значение сеанса показывает пробел, где он должен показывать символ «+». Это приводит к тому, что мой SQL не может найти совпадение.

Когда я создаю переменную сеанса тестирования, такую ​​как session("plus") = '+', это работает отлично. Однако session("email") = request("email") преобразует '+' в пробел.

If Request("email") <> "" Then
    Session("email") = Request("email")
    Session("DBstatus") = "Password Reset Requested"
End If

Я ожидаю этого: session("email") = "bob+1@outlook.com"

Я получаю это: session("email") = "bob 1@outlook.com"

Я пытался использовать server.urlencode, но это не соответствует сохраненному значениюв моих таблицах.

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Это один из способов. Это может работать с электронной почтой, потому что мы все знаем, что адреса электронной почты не могут содержать пробелы.

Однако, когда речь идет о других строковых значениях, которые не имеют строгих правил, таких как электронные письма, некоторые из них, которые могут иметь + и пробелы, будут в конечном итоге декодированы как пробелы. Таким образом, вы не сможете определить, какой из них следует заменить знаком плюса.

ASP.NET автоматически вызывает UrlDecode () при доступе к свойству по индексу ключа (т. Е. (Request.QueryString ["key")]). https://stackoverflow.com/a/13095475/2289769

Возьмем следующий пример:

Строка, переданная в браузер

spacebetween=Q Q&pluscharbetween=Q+Q&encodedpluschar=Q%2BQ

QueryString, закодированная браузером

spacebetween=Q%20Q&pluscharbetween=Q+Q&encodedpluschar=Q%2BQ

Интерпретируется ASP (Request.QueryString.ToString ()):

spacebetween=Q+Q&pluscharbetween=Q+Q&encodedpluschar=Q%2bQ

UrlDecoded () ASP

spacebetween: Q Q

pluscharbetween: Q Q

encodedpluschar: Q+Q

С учетом вышесказанного лучше всего кодировать любое строковое значение, переданное браузеру, если вы хотите его получитьобратно точно так, как есть.

Вы можете провести свой собственный тест:

<h4>UrlDecoded()</h4>
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>
<h4>Without Decoding()</h4>
<asp:Label ID="Label2" runat="server" Text=""></asp:Label>
If Request.QueryString.ToString().Length > 0 Then
    For Each key As String In Request.QueryString.Keys
        If Request.QueryString.Get(key).Length > 0 Then
            Label1.Text &= String.Format("{0}: {1}<br />", key, Request.QueryString.Get(key))
        End If
    Next

    Dim items As String() = Request.QueryString.ToString().Split("&".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)

    For Each item In items
        Dim key = item.Split("=")(0)
        Dim value = item.Split("=")(1)

        Label2.Text &= String.Format("{0}: {1}<br />", key, value)
    Next
End If
0 голосов
/ 02 ноября 2019

Ладно, на данный момент я разобрался с этим ублюдком с моим хорошим другом. Я не знаю, буду ли я сталкиваться с проблемами в будущем, но эта маленькая функция сделала свое дело:)

ViewState ("email") = Session ("электронная почта"). Replace ("","+")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...