none
【AJAX】IE下利用AJAX为什么不能获取到实时变化的Session呢? RRS feed

  • 问题

  • 本人想利用JS来判断实时的验证码输入是否正确然后给出提示。由于验证码是服务器端生成的,而且是无刷新更换那种。在客户端比较难以访问。所以利用AJAX来解决此问题。

    但目前有一个问题,就是在FF下利用JS可以获取实时变化的Session变量,而在IE下就不行。无论验证码怎样变化却始终获取的是一开始生成的验证码。苦思冥想实在想不通问题到底出在哪里,恳请高手帮忙。

    前台代码如下:

    <li><b>验 证 码:</b>
                                <input class="newinput-2" id="validateCode"  onfocus="setValidateCodeTip();" onblur="Jach();" maxlength="5" runat="server" />  
                                <img id="getcode" runat="server" src="img.aspx"  style="width: 60px; height: 20px; margin-bottom:-4px;"  alt="验证码"  onClick="this.src='img.aspx?r='   +   Math.random()" />
                                <span id="showValidateInfo"></span></li></ul>

    JS代码如下:

    function Jach()
    {
       
        var code=CheckCode();
        if($('validateCode').value!=code)
        {

            $('showValidateInfo').className = "error"; 
      $('showValidateInfo').innerHTML = "您的验证码不正确";
      validateCodeFlag="1";
     
        }
        else
        {
            if(navigator.appName.indexOf("Explorer") > -1)
                $('showValidateInfo').innerText = " ";       
                else
                $('showValidateInfo').textContent = " ";
          $('showValidateInfo').className = "succ";
          validateCodeFlag = '0';
        }alert(code);
    }

    //其中CheckCode()为获取实时验证码的函数代码如下:


    //创建xmlHttp对象
           function createXMLHTTP()
                {
                var xmlHttp=null;
                      try
                      {
                      xmlHttp=new ActiveXObject("MSXML2.XMLHTTP");
                      }
                      catch(e)
                      {
                      try
                      {
                      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                      }
                      catch(e2)
                      {
                     // xmlHttp=false;
                      }
                      }
                     if(!xmlHttp && typeof XMLHttpRequest!='undefined')
                      {
                      try
                      {
                      xmlHttp=new XMLHttpRequest();
                      }
                      catch(e)
                      {
                     // xmlHttp=false;
                      }
                       
                      }
                      return xmlHttp;
                }


    //检测验证码
    function CheckCode()
    {
       var objxml = createXMLHTTP();
       objxml.open("GET","checkinfo.ashx",false);
       objxml.send("");
        var sResult=objxml.responseText;
        if(objxml.status=="200")
        {
            return sResult;
        }
    }


    ashx代码如下:

     public void ProcessRequest (HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write(context.Session["CheckCode"]);//这里我只获取了服务器的Session,然后输出到前台以备JS提取
             context.Response.End();
        }

    public bool IsReusable {
            get {
                return false;
            }
        }

    //说明:为了ashx文件能够使用Session,该文件已经继承了 IHttpHandler,IRequiresSessionState 接口


    问题究竟出在哪里呢?请高手指点,小弟不胜感激。谢谢!

    2010年2月8日 14:20

答案

  • 本人想利用JS来判断实时的验证码输入是否正确然后给出提示。由于验证码是服务器端生成的,而且是无刷新更换那种。在客户端比较难以访问。所以利用AJAX来解决此问题。

    但目前有一个问题,就是在FF下利用JS可以获取实时变化的Session变量,而在IE下就不行。无论验证码怎样变化却始终获取的是一开始生成的验证码。苦思冥想实在想不通问题到底出在哪里,恳请高手帮忙。

    前台代码如下:

    <li><b>验 证 码:</b>
                                <input class="newinput-2" id="validateCode"  onfocus="setValidateCodeTip();" onblur="Jach();" maxlength="5" runat="server" />  
                                <img id="getcode" runat="server" src="img.aspx"  style="width: 60px; height: 20px; margin-bottom:-4px;"  alt="验证码"  onClick="this.src='img.aspx?r='   +   Math.random()" />
                                <span id="showValidateInfo"></span></li></ul>

    JS代码如下:

    function Jach()
    {
       
        var code=CheckCode();
        if($('validateCode').value!=code)
        {

            $('showValidateInfo').className = "error"; 
      $('showValidateInfo').innerHTML = "您的验证码不正确";
      validateCodeFlag="1";
     
        }
        else
        {
            if(navigator.appName.indexOf("Explorer") > -1)
                $('showValidateInfo').innerText = " ";       
                else
                $('showValidateInfo').textContent = " ";
          $('showValidateInfo').className = "succ";
          validateCodeFlag = '0';
        }alert(code);
    }

    //其中CheckCode()为获取实时验证码的函数代码如下:


    //创建xmlHttp对象
           function createXMLHTTP()
                {
                var xmlHttp=null;
                      try
                      {
                      xmlHttp=new ActiveXObject("MSXML2.XMLHTTP");
                      }
                      catch(e)
                      {
                      try
                      {
                      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                      }
                      catch(e2)
                      {
                     // xmlHttp=false;
                      }
                      }
                     if(!xmlHttp && typeof XMLHttpRequest!='undefined')
                      {
                      try
                      {
                      xmlHttp=new XMLHttpRequest();
                      }
                      catch(e)
                      {
                     // xmlHttp=false;
                      }
                       
                      }
                      return xmlHttp;
                }


    //检测验证码
    function CheckCode()
    {
       var objxml = createXMLHTTP();
       objxml.open("GET","checkinfo.ashx",false);
       objxml.send("");
        var sResult=objxml.responseText;
        if(objxml.status=="200")
        {
            return sResult;
        }
    }


    ashx代码如下:

     public void ProcessRequest (HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write(context.Session["CheckCode"]);//这里我只获取了服务器的Session,然后输出到前台以备JS提取
             context.Response.End();
        }

    public bool IsReusable {
            get {
                return false;
            }
        }

    //说明:为了ashx文件能够使用Session,该文件已经继承了 IHttpHandler,IRequiresSessionState 接口


    问题究竟出在哪里呢?请高手指点,小弟不胜感激。谢谢!


    经过不断思索终于找到了问题所在;是由于open方法使用了get传参引起的。大家注意我这段代码objxml.open("GET","checkinfo.ashx",false);由于传递的checkinfo.ashx后面没有参数故不能使用get提交方式。
    • 已标记为答案 jinwb1982 2010年2月8日 16:17
    2010年2月8日 16:08