本文将分享模仿人人网拖动滚动条到页面底端时加载新消息[AJAX、jQuery、webservice]的详细内容,并且还将对人人网模仿facebook进行详尽解释,此外,我们还将为大家带来关于ajax、
本文将分享模仿人人网 拖动滚动条到页面底端时加载新消息[AJAX、jQuery、web service]的详细内容,并且还将对人人网模仿facebook进行详尽解释,此外,我们还将为大家带来关于ajax、jquery、jquery模板实现异步表单,局部刷新、Ajax、Jquery、Json简介、AJAX实现无刷新分页(三层存储过程WebServiceAJAXJquery)、Asp.net Webservice – 使用jquery AJAX安全地调用webservice的相关知识,希望对你有所帮助。
本文目录一览:- 模仿人人网 拖动滚动条到页面底端时加载新消息[AJAX、jQuery、web service](人人网模仿facebook)
- ajax、jquery、jquery模板实现异步表单,局部刷新
- Ajax、Jquery、Json简介
- AJAX实现无刷新分页(三层存储过程WebServiceAJAXJquery)
- Asp.net Webservice – 使用jquery AJAX安全地调用webservice
模仿人人网 拖动滚动条到页面底端时加载新消息[AJAX、jQuery、web service](人人网模仿facebook)
Scott
模仿人人网 拖动滚动条到页面底端时加载新消息[AJAX、jQuery、web service]
当页面滚动到低端时,执行ajax方法从web service获取更多微博,并加载到页面上
GetMicroblogs.js
/// <reference path="../Scripts/jquery-1.4.1-vsdoc.js" /> $(function () { var i = 0; $(window).bind("scroll",function (event) { 滚动条到网页头部的 高度,兼容ie,ff,chrome var top = document.documentElement.scrollTop + document.body.scrollTop; ??????网页的高度var textheight = $(document).height(); 网页高度-top-当前窗口高度 if (textheight - top - $(window).height() <= 100) { if (i >= 25) { return; 控制最大只能加载到100条 } $('#divContent').css("height",$(document).height() + 400); i++; 可以根据实际情况,获取ajax动态数据加载到 divContent中 var dataParas = '{ pageIdx:"' + i.toString() + '"}'; 这里要直接使用JOSN作为webService参数 $.ajax({ type: "POST",dataType: "json",contentType: "application/json",data: dataParas,url: "../MicroBlog.asmx/GetMicroBlogs",success: function (data) { 将获取到的JSON对象数组转换为js对象 var blogs = eval("MicroBlogs = " + data.d); 遍历微博对象数组,追加到divContent中for (var j = 0; j < 4; j++) { $('<div>' + blogs.MicroBlogs[j].Sender + '</div>').appendTo($('#divContent')); } },error: function () { alert("error occured!"); } }); } }); }); 页面加载时引发 $(document).ready(doc_ready); 页面加载时加载前4条微博 function doc_ready() { var jsonParas = '{ pageIdx:"0"}'; $.ajax({ type: "POST",data: jsonParas,255)">function (data) { var blogs = eval("MicroBlogs = " + data.d); var j = 0; j < 4; j++) { $('<div>' + blogs.MicroBlogs[j].Sender + '</div>').appendTo($('#divContent')); } },error: ajax_error() }); } function ajax_error() { alert("The call to webService is Failed!!!!!"); }
前台页面:
ScrollLoadMicroBlog.aspx :
使用ajax方法从web service获得json数据:
MicroBlog.asmx :
ajax、jquery、jquery模板实现异步表单,局部刷新
一.利用ajax表单实现异步表单局部刷新 Ajax.BeginForm()方法
布局文件中添加必要的库文件
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
Model中添加一个Singer类
public class Singer { public int SingerId { get; set; } public string SingerName { get; set; } }
播种数据库时添加几条数据
public class InitData : DropCreateDatabaseIfModelChanges<AutoDbEntities> { protected override void Seed(AutoDbEntities context) { context.Singers.Add(new Singer { SingerName = "周杰伦"}); context.Singers.Add(new Singer { SingerName = "周笔畅"}); context.Singers.Add(new Singer { SingerName = "周华健"}); context.Singers.Add(new Singer { SingerName = "12"}); context.Singers.Add(new Singer { SingerName = "123"}); context.Singers.Add(new Singer { SingerName = "1234"}); base.Seed(context); } }
添加一个控制器HomeController
HomeController中Index()方法
public ActionResult Index() { return View(); }
Index视图
@{ ViewBag.Title = "Index"; } <h2>Index</h2> <div> @*利用ajax表单实现异步表单局部刷新*@ @using (Ajax.BeginForm("Search","Home",new AjaxOptions { UpdateTargetId = "result" //要替换的元素id })) { <input type="text" name="search"/> <input type="submit" value="搜索"/> } </div> <div id="result"> 显示搜索结果 </div>
HomeController中添加Search()方法
public ActionResult Search(string search) { var singers = db.Singers.Where(a => a.SingerName.Contains(search)); return View(singers); }
为Search()方法添加一个分部视图
<div> @foreach (var item in Model) { <a href="#">@item.SingerName</a><br/> } </div>
运行程序
二.用Jquery实现 异步表单 局部刷新
1.通过返回html局部视图的方式实现刷新
修改Index视图
@{ ViewBag.Title = "Index"; } <h2>Index</h2> <script type="text/javascript"> $(function () { $("#form1").submit(function (event) { event.preventDefault(); //阻止表单提交 //传递HTML方式 var form = $(this); $("#result").load(form.attr("action"),form.serialize()); //替换页内元素 }); }) </script> <div> <form id="form1" method="get" action="@Url.Action("Search","Home")"> <input type="text" name="search"/> <input type="submit" value="搜索"/> </form> </div> <div id="result"> </div>
运行程序
2.通过返回JSON数据实现异步表单,局部刷新,利用Jquery模板实现局部刷新,通过$.getJSON()方法得到传递的JSON数据
需要一个Jquery Template插件的支持,可以在Nuget中查找下载。安装插件后布局文件中添加需要的库文件
<script src="../../Scripts/jQuery.tmpl.js" type="text/javascript"></script>
修改HomeController中的Search()方法,使其返回JSON数据
public ActionResult Search(string search) { var singers = db.Singers.Where(a => a.SingerName.Contains(search)); return Json(singers,JsonRequestBehavior.AllowGet); }
修改Index视图
@{ ViewBag.Title = "Index"; } <h2>Index</h2> @*Jquery模板*@ <script id="myTemplate" type="text/x-jquery-tmpl"> <a href="#">${SingerName}</a><br/> //JSON数据中包含的属性 </script> <script type="text/javascript"> $(function () { $("#form1").submit(function (event) { event.preventDefault(); //阻止表单提交 //传递JSON方式 var form = $(this); $.getJSON(form.attr("action"),form.serialize(),function (data) { //getJSON()方法,利用表单得到JSON数据 $("#myTemplate").tmpl(data).appendTo("#result"); //tmpl方法,把模板添加到指定位置 }); }); }) </script> <div> <form id="form1" method="get" action="@Url.Action("Search","Home")"> <input type="text" name="search"/> <input type="submit" value="搜索"/> </form> </div> <div id="result"> </div>
运行程序
Ajax、Jquery、Json简介
Ajax、Jquery、Json简介
1.Ajax概述
①Asynchronous JavaScript And XML(异步的JavaScript和XML)是几种技术的强强联合,Ajax实际上就是一种使用JavaScript控制前台所有操作,同时在后台把得到的数据用XML代码来传递给前台的一种Web程序开发模式。
②好处:(1)请求响应能够通过其他JavaScript动作来实现
(2)可以不用刷新整个页面,只刷新需要改变数据的一部分
(3)能够开发出更具有吸引力的页面效果
③一段XML代码
public String getXML(Student stu){
StringBuffer sb = new StringBuffer();
sb.append("<xml version=1.0 >");
sb.append("<student>");
sb.append("<name>"+stu.getName()+"</name>");
sb.append("<age>"+stu.getAge()+"</age>");
sb.append("</student>");
return sb.toString();
}
2.使用Ajax进行请求和普通form提交请求的区别
①form提交
对象是HttpServletRequest,请求和响应的过程是同步的
<form action="sssServlet" method="post"> </form>
<a href="xxServlet?name=value" >链接</a>
②Ajax请求
对象是XMLHttpRequest,请求和响应的过程是异步的
<!-- JS代码-->
xmlreq.open("method","url",true);
xmlreq.send("name=value");
③同步和异步通讯
⑴同步:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。
如下图所示:
-------------------A
--------------------B
---------------------------------------总时间
⑵异步:在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备,在时间上错开,两边都可以工作,关键是不用刻意刷新页面,等待响应。
如下图所示:
---------------------------------A(浏览器)
-------------------------------B(服务器)
3.Ajax核心处理对象
①核心处理对象是一个浏览器内置的组件,在js中可以用对象名为XMLHttpRequest来表示。最早出现在IE4里面,后来其他浏览器中也都内置了该对象。不同浏览器创建该对象的方法不一样。
②IE浏览器中所有组件都叫做ActiveXObject,不同控件创建方式不一样
IE5之前var xmlreq = ActionXObject("Microsoft.XMLHTTP");
IE5之后var xmlreq = ActionXObject("Msxml2.XMLHTTP");
非IE浏览器var xmlreq = new XMLHttpRequest();
③常用方法:
(1) xmlreq.abort():取消当前的HTTP请求
(2) xmlreq.open("method",true):初始化一个HTTP请求,指定请求方法(Get/Post)、URL、身份验证信息等
(3) xmlreq.setRequestHeader():设置HTTP请求的头信息
(4) xmlreq.getResponseHeader():获得响应内容的HTTP头信息
(5) xmlreq.send(date):发送一个HTTP请求到服务器
④常用属性:
(1)xmlreq.onreadystatechange;指定当发生就绪状态变更事件时的处理者,通常是JavaScript函数
xmlreq.onreadystatechange=function××(){//回调函数}
(2)xmlreq.readyStateXMLHttpRequest对象专有的异步响应的状态
0表示未初始化,即XMLHttpRequest对象未创建open()方法未调用
1表示XMLHttpRequest对象被创建,但请求未发出send()未调用
2表示HTTP请求已经发出正在处理中,这时可以取得HTTP头信息,但是HTTP响应内容不可用
3表示HTTP响应内容部分数据可用,但响应还没有完成
4表示服务器响应完成,可以从属性responseBody、responseText、responseXML中获得完整响应内容
(3)xmlreq.status200(按照HTTP协议规定的状态值)
xmlreq.readyState=4与xmlreq.status=200的区别:
例如:从服务器A发送一仓库瓷器,到浏览器B,中间可能会有很多车来进行运输,而且各个车走的路线也不同。如何保证收到的货数量正确而且没有货物破损?
xmlreq.readyState=4验证返回数据的数量是否OK
xmlreq.status=200验证返回数据完整性是否OK
(4)响应主体responseBody:以无符号字节数组描述响应内容正文
(5)响应流responseStream:以IStream(二进制数据流)形式描述响应内容正文
(6)响应文本responseText:响应内容正文的纯文本形式
(7)响应XML responseXML:以XML Dom描述响应内容正文,(常用)
4.Ajax开发的步骤
①创建XMLHttpRequest对象
②使用xmlreq.open()方法指定要连接的服务器代码和请求提交方法
③指定服务器响应完成后,如何处理服务器响应内容--回调函数
④使用xmlreq.send()提交请求
补充:服务器端操作
①得到页面请求参数
②判断或数据库查询
③通过response对象返回响应结果(与之前有区别)
5.(补充)jQuery基本语法
①使用jQuery
⑴如何引入jQuery <script type="text/javascript" src="jquery.js"></script>
⑵如何调用jQuery要想安全、无错的调用jQuery代码,必须把它们放在一个函数中
<script language=JavaScript>
$(document).ready(function(){
//在这里写jQuery代码能够被正常调用
$("div").addClass("a");
});
</script>
-------------------------------------------------------------------------------
document:DOM文档对象,只能调用DOM API中的方法
$(document):jQuery对象,能调用jQuery API中的方法,简单很多
.ready():html文档加载完毕,触发的事件,开始干活
function(){}:html加载完毕后,如何处理
$("div"):jQuery选择器,转化<div>标签为jQuery对象
.addClass("a"):给该标签添加一个class属性,<div>
②核心能力----选择器
jQuery的根本在于它在页面上选择和操作某些元素的能力。
jQuery创建了自己的选择语法,非常简单。它通过HTML元素名、ID、Class查找对象,返回的对象都是jQuery对象
jQuery对象不能直接调用DOM定义的方法,只能使用jQuery API中指定的方法
举例:
$(“div”).show();//按照html选择
$("p").css("background","#ff0000");//
$("#sampleText").html("Hi");//按照ID选择
$(“.redBack”).css(“background”,“#ff0000”);//按照CSS选择
jQuery可以合并搜索结果,可以在一个搜索中,将多个搜索条件合并起来。通过使用“,”分隔每个搜索条件,搜索将返回与搜索词匹配的一组结果
$(“p,span,div”).hide();//按照合并条件选择
③遍历
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
var aa = $("li");//得到数组
//需要对其中某些元素进行单独的设置,需要循环该数组---循环就是遍历
$("li").each(function(i){
//该每次循环取出的标签添加文字
$(this).html("列表"+i);
});
each()函数,和“for loop”的功能一样,遍历每个函数并通过迭代递增元素,循环中每个元素的引用都可以通过“this”或$(this)来实现:
实现表格隔行换色效果
$("tr").each(function(i){
$(this).css({background: ["#ccc","#fff"][i%2]});
});
其他函数:
slice(start,end)//按照指定的开始结束索引截取
next()//查找后面他紧邻的同辈元素
filter(expr)//根据条件过滤
④赋值、取值
⑴jQuery可以使用同一个函数实现给页面中某个元素赋值和取值;带参数就是赋值方法;不带参数就是取值方法。
代码如下:
$(“#msg”).html();//返回id=msg的元素节点的html内容
$(“#msg”).html(“<b>new Content</b>”); //将新内容写入id=msg的元素中
$(“#msg”).text(); //返回id=msg的元素节点的文本内容
$(“#msg”).text(“new Content”); //将文本写入id=msg的元素节点中
$(“#msg”).height();//返回id=msg的元素的高度
$(“#msg”).height(“300”); //将id=msg的元素高度设为300
$(“input”).val();//返回表单的value值
$(“input”).val(“test”);//将表单的value值设置为test
$(“#msg”).click() ;//触发id=msg的元素的单击事件
$(“#msg”).click([fn]) ;//为id=msg的元素的单击事件添加函数
jQuery方法的返回值全部是jQuery对象,所以可以支持方法的连写,简化代码。
⑵jQuery函数可以方便的得到或者修改任意元素的样式,从而改变页面效果
主要包括以下样式:
$("#msg").css("background"); //返回元素的背景颜色
$("#msg").css("background","#ccc") //设定元素背景为灰色
$("#msg").height(300); $("#msg").width("200"); //设定宽高
$("#msg").css({ color: "red",background: "blue" });//以名值对的形式设定样式
$("#msg").addClass("select"); //为元素增加名称为select的class
$("#msg").removeClass("select"); //删除元素名称为select的class
$("#msg").toggleClass("select"); //如果存在(不存在)就删除(添加)名称为select的class
⑶jQuery还提供了几个实用的方法,实现状态切换功能。如:
toggle()方法包括了hide()和show()方法
slidetoggle()方法包括了slideDown()和slideUp方法
⑷jQuery已经把所有的DOM事件处理都进行了封装,我们可以直接通过jQuery对象获得对象并添加事件处理。
代码如下:
$("#msg").click(function(){alert("good")})//为元素添加了单击事件
$("p").click(function(i){this.style.color=['#f00','#0f0','#00f'][i]})
//为三个不同的p元素单击事件分别设定不同的处理
⑤jQuery进行Ajax处理的方法
Ajax如果使用JavaScript完成必须要
(1)进行浏览器判断
(2)创建XMLHttpRequest对象
(3)打开与服务器的连接
(4)设置回调函数
(5)发送请求
在jQuery中,把上述5个步骤,合为一体。
$.ajax({
type: "POST",
url: "some.do",
data: "name=John&location=Boston",
success: function(msg){
//回调函数,msg服务器返回的数据
alert( "Data Saved: " + msg );
}
});
6.(补充)JSON
①在Web程序中,需要从服务器返回数据,要求返回的不只有字符串、还可以返回XML等。
返回的不同格式中包含的数据量不同:
Content-Type="text/html""text/xml"
(1)String str = "标题|正文|作者";
解析字符串,适合在传递少量数据时使用
String[] sarr = str.split("|");
String title = sarr[0];
String count = sarr[1];
String author = sarr[2];
(2)服务器返回的数据
"<xml version="1.0" >
<car total="$50.">
<item name="">
<amount></amount>
</itme>
<item name="">
<amount></amount>
</itme>
<item name="">
<amount></amount>
</itme>
</car>"
在浏览器中取出数据
DOMdocument.getElementByTagName("car");
jQuery$("items").each(function(i){
$(this name).val();
});
优缺点对比:
(1)服务器返回String字符串,在浏览器中解析简单,但是数据量比较小。
(2)服务器返回xml字符串,能够包含大量数据,但是服务器端的转化代码不能通用,前台解析有固定的方法,比字符串解析要更可靠。
②程序开发中还可以选择另外一种通用数据格式:JSON
(1)既有字符串的简易性
(2)又有XML的格式化
以下即是JSON的两种结构:
[{"id":"260","name":"长沙"},{"id":"261","name":"张家界"},
{"id":"262","name":"株洲"},{"id":"263","name":"韶山"},
{"id":"264","name":"衡阳"},{"id":"265","name":"郴州"},
{"id":"267","name":"娄底"},{"id":"268","name":"耒阳"},
{"id":"269","name":"永州"},{"id":"270","name":"湘乡"},
{"id":"271","name":"湘潭"},{"id":"272","name":"常德"},
{"id":"273","name":"益阳"},{"id":"274","name":"怀化"},
{"id":"275","name":"邵阳"},{"id":"276","name":"岳阳"},
{"id":"277","name":"吉首"},{"id":"278","name":"大庸"},
{"id":"279","name":"韶山"}]
[{"id":"1","name":"中国"}]
(1)用[]表示其中包含多个数据,是一个数组
(2)用{}表示其中的某一条数据
(3)用,表示数据与数据之间的分割
(4) 用:表示某一条数据,名称和值的关系AJAX实现无刷新分页(三层存储过程WebServiceAJAXJquery)
前台html页
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<style type="text/css">
table
{
border:1px solid #333;
}
table td
{
border:1px solid #333;
}
</style>
<script src="Jquery1.7.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
var pageindex = 1;
var pagesize = 10;
var lastpageindex = 1;
function fenye() {
$.ajax({
type: "post",
contentType: "application/json",
url: "WebService1.asmx/GetListAjax",
data: "{pagesize:" + pagesize + ",pageindex:" + pageindex + "}",
success: function (result) {
//alert(result.d[0].NewsTitle);
var sb1 = '<table>';
sb1 += "<tr><td>编号</td><td>标题</td><td>内容</td><td>创建时间</td></tr>";
for (var i = 0; i < result.d.length; i++) {
sb1 += '<tr>';
sb1 += '<td>' + result.d[i].Id + '</td>';
sb1 += '<td>' + result.d[i].NewsTitle + '</td>';
sb1 += '<td>' + result.d[i].NewsContent + '</td>';
sb1 += '<td>' + result.d[i].CreateTime + '</td>';
sb1 += '<tr>';
}
sb1 += '</table>';
$('#mydiv').html(sb1);
}
})
}
$.ajax({
type: "post",
url: "WebService1.asmx/pageindexcount",
data: "{pagesize:" + pagesize + "}",
success: function (result) {
lastpageindex = result.d;
}
})
fenye();
$('a:eq(0)').click(function () {
pageindex = 1;
fenye();
})
$('a:eq(1)').click(function () {
if (pageindex > 1) {
pageindex--;
fenye();
}
})
$('a:eq(2)').click(function () {
if (pageindex < lastpageindex) {
pageindex++;
fenye();
}
})
$('a:eq(3)').click(function () {
pageindex = lastpageindex;
fenye();
})
$('a:eq(4)').click(function () {
pageindex = $('#txtpageindex').val();
fenye();
})
})
</script>
</head>
<body>
<div id="mydiv"></div>
<div>
<a href="#">第一页</a>
<a href="#">上一页</a>
<a href="#">下一页</a>
<a href="#">最后一页</a>
<input type="text" id="txtpageindex"/>
<a href="#">GO</a>
</div>
</body>
</html>
WebService代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data;
namespace 分页
{
/// <summary>
/// WebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolBoxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
public List<WebAJAX.Model.T_News1> GetListAjax(int pagesize,int pageindex)
{
WebAJAX.BLL.T_News1 bnews = new WebAJAX.BLL.T_News1();
DataTable dt = bnews.GetListDataTable(pagesize,pageindex);
List<WebAJAX.Model.T_News1> list = new List<WebAJAX.Model.T_News1>();
int id;
string newscontent = "";
string newstitle = "";
DateTime createtime;
for (int i = 0; i < dt.Rows.Count; i++)
{
id = Convert.ToInt32(dt.Rows[i]["Id"]);
newstitle = dt.Rows[i]["NewsTitle"].ToString();
newscontent = dt.Rows[i]["NewsContent"].ToString();
createtime = Convert.ToDateTime(dt.Rows[i]["CreateTime"]);
WebAJAX.Model.T_News1 news = new WebAJAX.Model.T_News1();
{
news.Id = id;
news.NewsTitle = newstitle;
news.NewsContent = newscontent;
news.CreateTime = createtime;
};
list.Add(news);
}
return list;
}
[WebMethod]
public int pageindexcount(int pagesize)
{
var lastpageindex = 1 ;
WebAJAX.BLL.T_News1 pagecount = new WebAJAX.BLL.T_News1();
var lastpage = pagecount.GetRecordCount("");
if (lastpage % pagesize == 0)
{
lastpageindex = lastpage / pagesize;
}
else
{
lastpageindex = lastpage / pagesize + 1;
}
return lastpageindex;
}
}
}
存储过程代码
create Proc pro_fenye
@pagesize int,
@pageindex int
as
select * from(select ROW_NUMBER() over(order by Id) as rownumber,Id,NewsTitle,SUBSTRING(NewsContent,20)as NewsContent,CreateTime from T_News1) T
where rownumber>(@pageindex-1)*@pagesize and rownumber<=@pagesize*@pageindex
go
手写三层代码
BLL
//分页方法
public DataTable GetListDataTable(int pagesize,int pageindex)
{
return dal.GetListDataTable(pagesize,pageindex);
}
DAL
<summary>
分页获取数据列表
</summary>*/
public DataTable GetListDataTable(int PageSize,int PageIndex)
{
sqlParameter[] parameters = {
new sqlParameter("@PageSize",sqlDbType.Int),
new sqlParameter("@PageIndex",sqlDbType.Int)
};
parameters[0].Value = PageSize;
parameters[1].Value = PageIndex;
return DbHelpersql.RunProcedureDataTable("pro_fenye",parameters);
}
sqlhelper
//分页执行存储过程返回DataTable
public static DataTable RunProcedureDataTable(string storedProcName,IDataParameter[] parameters)
{
using (sqlConnection connection = new sqlConnection(connectionString))
{
DataTable dt = new DataTable();
connection.open();
sqlDataAdapter sqlDA = new sqlDataAdapter();
sqlDA.SelectCommand = BuildQueryCommand(connection,storedProcName,parameters);
sqlDA.Fill(dt);
connection.Close();
return dt;
}
}
Asp.net Webservice – 使用jquery AJAX安全地调用webservice
我有以下web服务,例如:
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolBoxItem(false)] [System.Web.Script.Services.ScriptService] public class Users : System.Web.Services.WebService { [WebMethod] public List<User> GetUsers() { List<User> listUsers = new List<User>(); User user = new User(); user.Id = 1; user.Name = "John"; User user2 = new User(); user2.Id = 2; user2.Name = "Martin"; listUsers.Add(user); listUsers.Add(user2); return listUsers; } } }
我用jquery ajax调用webservice:
<script type="text/javascript"> $(function () { getUsers(); function getUsers() { $.ajax({ type: "POST",url: "Webservices/Users.asmx/GetUsers",data: "{}",contentType: "application/json; charset=utf-8",dataType: "json",success: function (response) { var users = response.d; $.each(users,function (index,user) { console.log(user.Name); }); },failure: function (msg) { } }); } }); </script>
解决方法
在配置文件中,您可以拥有
<authorization> <deny users="?" /> </authorization>
这将拒绝匿名用户访问,也将覆盖Web服务.换句话说,除非用户登录并获得带有故障单的有效cookie,否则无法使用服务.当然,您必须使用HTTPS.否则,中间的任何人都可以在标题中获取cookie并致电您的服务.
最后,无法确保在绝对意义上没有人在您的应用程序之外调用Web服务.上述方法确保中间没有人调用您的服务.但是没有办法确保有效用户直接在您的应用程序之外调用服务,因为Web服务调用者是JavaScript,并且用户可以通过查看脚本或甚至查看脚本轻松找出您在JavaScript中构建的任何安全性.来自浏览器的流量.任何具有一定技术性的最终用户都可以重播请求或修改请求,并使用有效凭据提交给您的Web服务.
编辑:-
以下是您要启用FormsAuthentication的详细信息.
(1)在Web.config中,在< system.web>下,确保你有这个.
<authentication mode="Forms"> <forms loginUrl="Login.aspx" defaultUrl="~/" /> </authentication> <authorization> <deny users="?" /> </authorization>
这将确保所有未经过身份验证的(匿名)用户重定向到Login.aspx.
(2)使用您的登录逻辑实现Login.aspx以获取用户ID和密码,并根据数据库或其他任何方式验证它们.一旦身份验证成功,即用户输入的ID和密码与您在数据库中的内容匹配,可以在登录按钮单击处理程序中设置故障单.
protected void Button1_Click(object sender,EventArgs e) { // Do all your login logic here // once user ID and password entered by the user are okay,call this string ticket = FormsAuthentication.Encrypt( new FormsAuthenticationTicket("userId",false,15)); HttpCookie FormsCookie = new HttpCookie( FormsAuthentication.FormsCookieName,ticket) { HttpOnly = true }; HttpContext.Current.Response.Cookies.Add(FormsCookie); }
(3)将PrincipalPermissionAttribute添加到这样的Web方法中.
public class Users : System.Web.Services.WebService { [PrincipalPermissionAttribute(SecurityAction.Demand)] [WebMethod] public List<User> GetUsers() { // Same code as what you have Now } }
如果您现在转到任何页面,您将被重定向到login.aspx,您需要输入用户ID和密码并登录.登录时,将创建表单身份验证cookie并将其写入响应.从那时起,对您的应用程序的所有请求都将引入cookie(浏览器将为您执行此操作).如果您没有登录,如果直接转到Web服务,您仍将被重定向到登录页面.正如我在原始答案中提到的,登录用户仍然可以直接访问Web服务.如果JavaScript可以做某事,用户也可以这样做.
顺便说一句,Web服务(asmx)是一种弃用的技术.
今天关于模仿人人网 拖动滚动条到页面底端时加载新消息[AJAX、jQuery、web service]和人人网模仿facebook的分享就到这里,希望大家有所收获,若想了解更多关于ajax、jquery、jquery模板实现异步表单,局部刷新、Ajax、Jquery、Json简介、AJAX实现无刷新分页(三层存储过程WebServiceAJAXJquery)、Asp.net Webservice – 使用jquery AJAX安全地调用webservice等相关知识,可以在本站进行查询。
本文标签: