JavaScript学习笔记——客户端与服务器端的通信
在Web项目中,要实现客户端与服务端的交互,可通过cookie、隐藏框架、HTTP请求、LiveConnect请求和智能HTTP请求等方式实现,
一. cookie
cookie是第一个JavaScript可以利用的客户端-服务端之间的交互手段。浏览器向服务器发送请求时,为这个服务器存储的cookie会与其他信息一起发送到服务器。这使得JavaScript可以在客户端设置一个cookie,之后服务器端就能够读取它了。
1. cookie的成分
名称——每一个cookie由一个唯一的名称代表。这个名称可以包含字母、数字和下划线。不区分大小写。
值——保存在cookie中的字符串值。这个值在存储之前必须用encodeURIComponent()对其进行编码,以免丢失数据或占用了cookie。名称和值加起来的字节数不能超过4095字节,也就是4KB。
域——处于安全考虑,网站不能访问其他域创建的cookie。创建cookie后,域的信息会作为cookie的一部分存储起来。不过,虽然这不常见,还是可以覆盖这个设置以允许另一个网站访问这个cookie的。
路径——另一个cookie的安全特性,路径限制了对Web服务器上的特定目录的访问。例如,可指定cookie只能从http://www.wrox.com/books中访问。
失效日期——确定cookie何时删除。默认情况下,关闭浏览器时,即将cookie删除,不过可以自己设置删除时间。这个值是个GMT格式的日期(可以使用Date对象的toGMTString()方法),用于制定应该删除cookie的准确时间。如果设置的日期是当前日期以前的时间,则cookie被立刻删除。
安全标志——用于表示cookie是否只能从安全网站(使用SSL和https协议的网站)中访问。可以将这个值设为true以加强保护,进而确保cookie不被其他网站访问。
2. 其他安全限制
i)每个域最多只能只能在一台用户的机器上存储20个cookie;
ii)每个cookie的总尺寸不能超过4096字节;
iii)一台用户的机器上的cookie总数不能超过30个。
3. JavaScript中的cookie
下面来看一个设置cookie的函数,如下所示:
function setCookie(sName, sValue, oExpires, sPath, sDomain, bSecure) {
var sCookie = sName + “=” +encodeURIComponent(sValue);
if (oExpires) {
sCookie +=”; expires=” + oExpires.toGMTString();
}
if (sPath) {
sCookie += “; path” + sPath;
}
if (sDomian) {
sCookie += “; domain” + sDomain;
}
if (bSecure) {
sCookie += “;secure”;
}
document.cookie = sCookie;
}
setCookie()函数只有前两个参数是必须的,函数的调用方法如下:
setCookie(“name”, “阿蜜果”);
setCookie(“book”, “JavaScript高级程序设计”, new Date(Date.parse(“Jan 1, 2006”)));
setCookie(“message”, “hello”, new Date(Date.parse(“Jan 1, 2006”)), “/books”, http://www.wrox.com, true );
下面的函数是一个根据cookie的名称获取cookie的方法,代码如下:
function getCookie(sName) {
var sRE= "(?:;.)?" + sName + "=([^;]*);?;
var oRE= new RegExp(sRE);
if (oRE.test(document.cookie)) {
return decodeURIComponent(RegExp[“$1");
} else {
return null;
}
}
调用该方法可以获取指定名称的cookie,调用举例如下:
var sName = getCookie(“name”);
下面我们再编写一个删除cookie的函数,只需将失效时间设为过去的一个时间即可,代码如下:
function deleteCookie(sName, sPath, sDomain) {
setCookie(sName, “”, new Date(0), sPath, sDomain);
}
4. 服务器端的cookie
1)JSP
Jsp提供了非常简单的处理cookie的接口,request对象会在执行JSP时自动初始化,有一个返回一个Cookie对象数组的方法getCookies()方法。每个Cookie对象都具有getName()、getPath(), getDomain(),getSecure(),getMaxAge()等方法,下面我们还看一个获取Cookie的方法:
public static Cookie getCookie(HttpServletRequest request, String name) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i<cookies.length; i++) {
if (cookies[i].getName().equals(name)) {
return cookies[i];
}
}
}
}
下面让我们再来看看怎么样新建一个cookie:
Cookie nameCookie = new Cookie(“name”, “Amigo”);
nameCookie.setDomain(“http://www.wrox.com”);
nameCookie.setPath(“/books”);
response.addCookie(nameCookie);
要删除cookie,可用如下方法:
Cookie cookieToDelete = getCookie(“name”);
cookieToDelete.setMaxAge(0);
response.addCookie(cookieToDelete);
2)ASP.NET
略。
3)PHP
略。
二. 隐藏框架
方法就是创建一个可用JavaScript与服务器进行通信的0像素高的框架。这种通信方式要求两部分内容:用于处理客户端通信的JavaScript对象和在服务端处理通信的特殊页面。Eg.
<html>
<head>
<title>隐藏框架的例子</title>
</head>
<frameset rows=”*, 0”>
<frame src=”test1.html” nam=”mainFrame” />
<frame src=”hidden.html” nam=”hiddenFrame” />
</frameset>
</html>
在第一个框架中,定义了两个函数,一个用于向服务器发送请求,另一个用于处理响应。发送请求的函数如下:
function getServerInfo() {
parent.frames[“hiddenFrame”].location.href = “hiddenFrameCom.html”;
}
处理回应的函数handleResponse()的代码如下:
function handleResponse(sResponseTextt) {
alert(“服务器返回: ” + sResponseTextt);
}
处理隐藏请求的页面必须输出一个普通的HTML页面,其中有个<textarea/>元素,包含返回的元素。使用<textarea/>可以方便的处理多行数据,这个页面必须在主框架中调用handleResponse()函数。实例代码如下:
<html>
<head>
<title>隐藏框架的例子</title>
<script type=”text/javascript”>
window.onload = function() {
parent.frames[0].handleResponse(
document.forms[“formResponse”].result.value);
};
</script>
</head>
<body>
补充:web前端 , JavaScript ,