• 验证视图状态MAC失败(ajax例子及源码)


    验证视图状态MAC失败
    2008年10月01日 星期三 13:20
    基本原理其实很简单,就是通过XMLHttpRequest把文本输入框内输入的内容传送给后台处理页面,后台处理完之后通过回调函数取得值,然后再把值输出在信息提示层上。以下代码做了些简化,大家明白原理就可以自由发挥了。

    1:前台页面index.html

    <html>
    <head>
    <script language="javascript" src="serch.js"></script><!--调用JS文件-->
    </head>
    <body>
    <form action="">
    <input name="title" type="text" onkeyup="show(document.getElementById('title').value)" ><!--定义一个文本框,用于输入数据,并通过键盘弹起事件调用函数show。document.getElementById('title').value用户取出文本框的值传到函数show()>
    </form>
    <div id="showcon" style="100px;height:100px;color:red"></div><!--定义一个显示层,用于显示回调的数据-->
    </body>
    </html>

    2:serch.js

    // 声明xmlHttpRequest对象

    var xmlHttp;


    function createxmlHttp()
    {
       if(window.xmlHttpRequest)
       {
          xmlHttp=new xmlHttpRequest();//mozilla浏览器
       }
       else if(window.ActiveXObject)
       {
           try
           {
               xmlHttp=new ActiveXObject("Msxml2.xmlHttp");//IE老版本
           }
           catch(e)
           {}
           try
           {
               xmlHttp=new ActiveXObject("Microsoft.xmlHttp");//ie新版本
           }
           catch(e)
           {}
           if(!xmlHttp)
           {
               window.alert("xmlHttpRequest对象创建失败!")
               return false;
           }
       }
    }
    function show(strtitle)
    {
       content=document.getElementById("showcon")//获得用于显示回调内容的DIV的ID
       if (strtitle!="")
       { //判断文本输入框是否有值输入
          createxmlHttp();        //调用xmlHttpRequest对象建立函数
          xmlHttp.onreadystatechange=show_title;   //回调函数是show_title
    //调用URL为带参数的ASP(任何动态页面)页面,该页面接收文本框输入值,从数据库内取出相对应的所有提示记录
          url="reserch.asp?title="+escape(strtitle);

    //特别注意:URL后边的参数strtitle如果 是英文和数字,程序执行没有任何问题的,不过如果是中文时,结果就不一样了、要么JS报错、要么没有返回值、要么很正常,网上查了下资料,把参数值经过 js内部函数escape()加密,就没问题了,关于escape()的用法,大家可以BAIDU以下。

          xmlHttp.open("POST",url,true);
          xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=gb2312');

    //特别注意:上边的中文出错的问题解决了,但你会发 现,返回的中文居然会显示乱码,这个时候就牵涉到中文兼容的问题了。解决方法分两种情况:1、当传值方式是POST时(如同本例),就需要加上 xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=gb2312');2、当传值方式是GET时,大家就需要在传 递的页面中加上response.charset="gb2312"   '或response.charset="GBK",不同的语言有不同的写法,大 家可以查资料。
          xmlHttp.send(null);
       }
       else {
          content.innerHTML="";
       }
    }

    function show_title()
    {
       if (xmlHttp.readyState==4){
          if (xmlHttp.status==200){
               recontent=xmlHttp.responseText; //取得页面返回的值
               show_con=document.getElementById("showcon");
               if (recontent!=""){
                   show_con.innerHTML=recontent;
               }
               else show_con.innerHTML="";
          }
        }
    }

    3:reserch.asp

    这就是处理页面,到这里大家就可以自由发挥了

    <%
    strtitle=request.QueryString("title")
    response.Write strtitle
    %>

    此段ASP代码就是简单的显示文本框输入的内容。大家在这里就可以通过参数访问数据库,实现用户名的检测、数据搜索等功能,只需要把内容Response,write就OK了,大家可以自由想象自由发挥了。

    友情提示:如果是使用ASP.NET的朋友需要注意了:

    你可能会遇到“验证视图MAC失败”的错误(因为我就遇到了,嘿嘿)。如果此引用程序由网络场或群集 承载,请确保<machineKey>配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerateP>

    原因:表格,指定了DataKeyNames属性,则出于安全的理由(因为DataKeyNames指定的字段代表数据的主键,且该主键值需要保存在视图 状态中发送到客户端,用户如果篡改主键值,会导致安全问题),GridView会要求加密视图状态。为此会自动在页面表单</forms>之 前添加一个<input type="hidden" name="__VIEWSTATEENCRYPTED" id="__VIEWSTATEENCRYPTED" value="" /> 。

    当UpdatePanel更新时,UpdatePanel内部的控件被提交到服务器进行处理(Patrial Rendering),而整个页面并没有被提交。也就是说隐藏的input控件没有随着一起提交。因此服务器并不知道提交的ViewState被加密了, 从而导致MAC验证错误。   

        
    解决方法:

    通过在Web.config里边添加

    <pages enableEventValidation="false" viewStateEncryptionMode ="Never" />

     

    转自:http://hi.baidu.com/ringbelling/blog/item/d7a3561346fb40045aaf539e.html

  • 相关阅读:
    常见的 常见的 User_Agent
    scp 传送数据的几种方式
    最近面试的几个问题 (三) io 多路复用
    mac 磁盘分区 时间胶囊创建失败
    最近面试的几个问题 (二) request_url 去重之布隆去重
    最近面试的几个问题 (一) 进程和线程、协程的区别
    chromedriver与chrome最新版本对应表 转自-河岸上的酸菜鱼 简书地址-https://www.jianshu.com/u/bbea92f78aca
    Sql代码美化工具:Sql Pretty Printer for SSMS V3.6.1
    如何给非理科生讲明白什么是云计算、大数椐(下)
    如何给非理科生讲明白什么是云计算、大数椐(上)
  • 原文地址:https://www.cnblogs.com/bicabo/p/1506460.html
Copyright © 2020-2023  润新知