验证视图状态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

原文地址:https://www.cnblogs.com/bicabo/p/1506460.html