0

我有以下代码来检查查询字符串是否未更改:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                Label_Error.Visible = false;
                string query_string = Request.QueryString["GUID"].ToString();
                Session["GUID"] = query_string;
            }

            else
            {
                string GUID = "";

                try
                {
                    GUID = Session["GUID"].ToString();
                }
                catch (Exception)
                {
                    Session.Abandon();
                    Response.Redirect("CheckOutErrorPage.htm");
                    return;
                }

                if (GUID.Equals(Request.QueryString["GUID"].ToString()) == false)
                {
                    Session.Abandon();
                    Response.Redirect("CheckOutErrorPage.htm");
                }
            }
        }

现在,我在按钮单击事件处理程序中有这段代码,以检查查询字符串的值是否(再次)没有改变:

protected void ImageButton_LogIn_Click(object sender, ImageClickEventArgs e)
        {
            Validation val = new Validation();

            string GUID = "";
            string query_string = "";

            try
            {
                GUID = Session["GUID"].ToString();
                query_string = Request.QueryString["GUID"].ToString();
            }
            catch (Exception)
            {
                Session.Abandon();
                Response.Redirect("CheckOutErrorPage.htm");
                return;
            }

            if (val.EmptyString(GUID) == true || val.checkTransactionGUIDExists(GUID) == false || GUID.Equals(query_string) == false)
            {
                Session.Abandon();
                Response.Redirect("CheckOutErrorPage.htm");
            }

现在,问题有两个:

1)如果我更改 URL 中的查询字符串并单击按钮,用户不会被重定向到错误页面。

2) 如果我更改 URL 中的查询字符串并在地址栏中按 Enter,则用户不会被重定向到错误页面。

我想要的基本上是,当用户被重定向到网页时,它将查询字符串保存到会话中。如果用户在地址栏中更改了查询字符串的值,并且在地址栏中按下回车键或按下我的按钮,他将被重定向到错误页面。

但是,我的代码失败了。有人可以帮忙吗?谢谢 :)

4

2 回答 2

2

这个怎么样?

protected void Page_Load(object sender, EventArgs e)
{
    // Always get the query string no matter how the user go to this page
    string query_string = Request.QueryString["GUID"].ToString();

    // Only store the query string in Session if there is nothing in Session for it
    if(null == Session["GUID"])
    {
        Session["GUID"] = query_string;
    }

    if (!this.IsPostBack)
    {
        Label_Error.Visible = false;
    }

    // Always check to see if the query string value matches what is in Session
    string GUID = "";
    try
    {
        GUID = Session["GUID"].ToString();
    }
    catch (Exception)
    {
        Session.Abandon();
        Response.Redirect("CheckOutErrorPage.htm");
        return;
    }

    if (GUID.Equals(Request.QueryString["GUID"].ToString()) == false)
    {
        Session.Abandon();
        Response.Redirect("CheckOutErrorPage.htm");
    }

这应该可以解决您Session在将查询字符串放入地址栏中并按下回车键时值被覆盖的问题。

于 2013-07-02T14:44:09.237 回答
1

我认为你的问题是Response.Redirect需要false在句子的最后,Response.Redirect("CheckOutErrorPage.htm", false);因为你在 try cath 中有它,错误将被抛出。

我希望对你有所帮助。

于 2013-07-02T14:24:00.653 回答