JavaScript客户端与服务器端的五种通信方式_服务器网页如何响应客户的请求 javascript-程序员宅基地

技术标签: xmlhttprequest  function  服务器  javascript  url  cookies  

在 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>

                     <form name=”formResponse”>

                            <textarea name=”result”>传送回的数据</textarea>

                     </form>

              </body>

       </html>

 

HTTP请求

 现在很多浏览器都可以直接从JavaScript中初始化HTTP请求并获取结果,完全不用隐藏框架和其他取巧的小技巧。

 这个令人振奋的新功能的核心是,微软创建的XML HTTP请求的对象。这个对象是与MSXML一起出现的,直到最近它的能力才被完全挖掘。XML HTTP请求实质上是添加了额外的用于发送和接收XML代码的功能的普通的HTTP请求。

 要在IE中重新创建XML HTTP请求对象,还是要使用ActiveXObject,如下所示:

var oRequest = new ActiveXObject(“Microsoft.XMLHTTP”);

 下面让我们看一个创建XML HTTP的方法:

function createXMLHTTP() {

       var arrSignatures = [“MSXML2.XMLHTTP.5.0”, “MSXML2.XMLHTTP.4.0”,

“MSXML2.XMLHTTP.3.0”, “MSXML2.XMLHTTP”,

“Microsoft.XMLHTTP”];

       for (var i=0; i< arrSignatures.length; i++) {

       try {

              var oRequest = new ActiveXObject(arrSignatures[i]);

              return oRequest;

} catch (oError) {

       //ignore

}

}

throw new Error(“你的机器上没有安装MSXML!”);

}

创建好HTTP请求后,可用open()方法来指定要发送的请求,该方法的参数描述如下:

第一个参数:值可为“get”或“post”,或其他受服务器支持的HTTP方法;

第二个参数:请求的URL;

第三个参数:表示请求是否以异步方式发送的布尔值。

Eg. oRequest.open(“get”, “example.txt”, false);

打开后,可用send()方法将请求发送出去,该方法需带一个参数,该参数可为null,

eg. oRequest.send(null);

下面让我们来看一个比较完整的例子:

var oRequest = createXMLHTTP();

oRequest.open(“get”, “example.txt”, false);

oRequest.send(null);

alert(“状态:” + oRequest.status + “(” + oRequest.statusText + “)”);

alert(“回应的文本信息:” + oRequest.responseText);

该例获取服务器端的一个纯文本文件,然后显示此内容。

如果发送异步请求,必须使用onreadystatechange事件处理函数,并检查readyState特性是否等于4(与XML DOM一样)。让我们来看一个例子:

var oRequest = createXMLHTTP();

oRequest.open(“get”, “example.txt”, true);

oRequest.onreadystatechange = function() {

    if (oRequest.readyState == 4) {

              alert(“状态:” + oRequest.status + “(” + oRequest.statusText + “)”);

alert(“回应的文本信息:” + oRequest.responseText);

 

}

}

oRequest.send(null);

1.       使用HTTP头部

XML HTTP请求对象提供了获取HTTP头部和设置它们的方法:

l         getAllResponseHeaders():返回包含所有响应的HTTP首部信息的字符串;

l         getResponseHeader():获取指定的某个头部,参数为获取的首部的名称,eg. var sValue = oRequest.getResponseHeader(“Server”);

l         setResponseHeader():设置XML HTTP请求的首部信息,eg. oRequest. setResponseHeader(“myheader”, “阿蜜果”).

2.       实现的赋值品

Mozilla第一个复制了XML HTTP实现,创建了名为XMLHTTPRequest的JavaScript,行为完全与微软的版本相同,Opera(7.6)和Safari(1.2)也复制了Mozilla的实现,创建了自己的XMLHTTPRequest对象。

3.       进行GET请求

Web上最常见的请求类型就是GET请求,下面让我们来看一个GET请求的例子,代码如下所示:

首先为了添加参数的方便性,让我们增加一个添加参数的方法,然后为请求构建一个URL,代码如下所示:

function addURLParam(url, sParamName, sParamValue) {

    url += (url.indexOf(“?”) == -1 ? “?” : “&”);

    url += encodeURIComponent(sParamName) + “=” + encodeURIComponent(sParamValue);

    return url;

}

var url =  “http://www.blogjava.net/amigoxie”;

url = addURLParam(url, “gender”, “女”);

url = addURLParam(url, “age”, “25”);

oRequest.open(“get”, url, false);

4.   进行POST请求

POST请求用于在表单中输入数据后的提交过程,因为POST可以比GET方式发送更多数据(最多2GB)。让我们来可看一个例子:

function addPostParam(sParams, sParamName, sParamValue) {

    if (sParams.length > 0) {

       sParams += “&”;

}

    return sParams + encodeURIComponent(sParamName) + “=” + encodeURIComponent(sParamValue);

}

 

Var sParams = “”;

sParams = addPostParam(sParams, “gender”, “女”);

sParams = addPostParam(sParams, “age”, “25”);

oRequest.open(“open”, “test.jsp”, false);

oRequest.send(sParams);

 

四.LiveConnect请求

 LiveConnect由Netscape Navigator引入,一般可以让JavaScript与Java类实现交互的能力。用户必须安装JRE,并且还需在浏览器中启用Java。

1.   进行GET请求

使用Live Connect时,必须提供类的完整名称,才能初始化一个Java对象。创建URL后,就可以打开一个输入流并使用读取器来读取数据。最好的方法是创建一个InputStreamReader,然后再基于它创建一个BufferReader,实例代码如下:

function httpGet(url) {

    var ourl = new java.net.URL(url);

var oStream = ourl.openStream();

var oReader = new java.io.BufferedReader(new java.io.InputStreamReader(oStream));

var oResponseText = “”;

var sLine = oReader.readLine();

while (sLine != null) {

       oResponseText += sLine + “\n”;

       sLine = oReader.readLine();

}

oReader.close();

return oResponseText;

}

注意:与XML HTTP请求对象不通,LiveConnect要求输入完整的请求的URL,从http://开始,因为,这个Java对象没有任何解释相对URL的上下文。

2.   进行POST请求

因为POST请求可看作是双向的,所以必须使用setDoInput()和setDoOutput()方法将连接设成接受输入和输出。另外,连接不应该使用任何缓存数据,所以要调用setUseCaches(false)。与XML HTTP请求对象一样,还必须用setRequestProperty()方法将“Content-Type”设置为相应的值。代码如下:

function httpPost(url, sParams) {

    var ourl = new java.net.URL(url);

    var oConnection = ourl.openConnection();

 

    oConnection.setDoInput(true);

    oConnection.setDoOutput(true);

    oConnection.setUseCaches(false);

    oConnection.setRequestProperty(“Content-Type”,

“application/x-www-form-urlencoded”);

 

       var output = new java.io.DataOutputStream(oConnection.getOutputStream());

       output.writeBytes(sParams);

       output.flush();

       output.close();

 

       var sLine = “”, sResponseText = “”;

       var input = new java.io.DataInputStream(oConnection.getInputStream());

       sLine = input.readLine();

       while (sLine != null) {

       sResponseText += sLine + “\n”;

              sLine = input.readLine();

input.close();

return oResponseText;

}

 

五. 智能HTTP请求

 对于两种完全不同的HTTP请求方法,有一系列通用的函数会对开发很有帮助。

1.  get()方法
 该方法用于对指定的URL进行一个GET请求。该方法有两个参数:发送请求的URL和一个回调函数。回调函数在很多编程语言中是用于在请求结束时通知开发者的。整合后的通用的get()方法代码如下:

var bXmlHttpSupport = (typeof XMLHttpRequest == “object” || window.ActiveXObject);

Http.get = function (url, fnCallback) {

       if (bXmlHttpSupport) {

       var oRequest = new XMLHttpRequest();

       oRequest.open(“get”, url, true);

       oRequest.onreadystatechange = function() {

       if (oRequest.readyState == 4) {

       fnCallback(oRequest.responseText);

}

}

oRequest.send(null);

} else if (navigator.javaEnabled() && typeof java != “undefined”

&& type java.net != “undefined”) {

setTimeout(function() {

       fnCallback(httpGet(url));

}, 10);

} else {

       alert(“你的浏览器不支持HTTP请求!”);

}

}

2.  post()方法

除了需要三个参数(URL、参数字符串和回调函数)外,post()方法类似于get()方法。代码如下:

var bXmlHttpSupport = (typeof XMLHttpRequest == “object” || window.ActiveXObject);

Http.post = function(url, sParams, fnCallback) {

        if (bXmlHttpSupport) {

       var oRequest = new XMLHttpRequest();

       oRequest.open(“post”, url, true);

       oRequest.setRequestHeader(“Content-Type”,

“application/x-www-form-urlencoded”);

                     oRequest.onreadysatechange = function() {

       if (oRequest.readyState == 4) {

              fnCallback(oRequest.responseText);

}

}

} else if ((navigator.javaEnabled() && typeof java != “undefined”

&& type java.net != “undefined”) {

       setTimeout(function() {

       fnCallback(httpPost(url, sParams));

}, 10);

} else {

       alert(“你的浏览器不支持HTTP请求!”);

}

}

注意:使用这个方法必须提供完整的URL.

转载自http://www.blogjava.net/amigoxie/archive/2007/08/15/136809.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/donggandi/article/details/7911062

智能推荐

计算机网络课后答案(郑希文)-程序员宅基地

文章浏览阅读146次。(1)由于在OSI之前,许多物理规程或协议已经制定出来了,而且在数据通信领域中,这些物理规程已被许多商品化的设备所采用,加之,物理层协议涉及的范围广泛,所以至今没有按OSI的抽象模型制定一套新的物理层协议,而是沿用已存在的物理规程,将物理层确定为描述与传输媒体接口的机械,电气,功能和规程特性。其中(k-1)*(p/b)表示K段传输中,有(k-1)次的储存转发延迟,当s>(k-1)*(p/b)时,电路交换的时 延比分组交换的时延大,当x>>p,相反。t=225比特时间,B就检测出A的信号。

C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理-程序员宅基地

文章浏览阅读613次。C语言中,数组初始化的方式主要有三种:1、声明时,使用 {0} 初始化;2、使用memset;3、用for循环赋值。 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码: [cpp] view plain copy #define ARRAY_SIZE_MAX (1*1024*1024) void function1() { char..._c语言数组初始化为0 double

linux基础知识_可以使用____命令查看隐藏文件。-程序员宅基地

文章浏览阅读141次。1、linux基础知识与技能1.1、隐藏文件与非隐藏文件linux中隐藏文件特点是文件名以“.”开头,跟文件属性无关。在linux中查看隐藏文件用ls -a命令(普通显示ls)1.2、相对路径与绝对路径路径(pathname):用来标识一个文件在操作系统的文件系统中存储位置的。举例:D:\winshare\enum.c 全路径 pathnameD:\winshare 路径 ..._可以使用____命令查看隐藏文件。

【机器学习】sklearn-决策树调参-DecisionTreeClassifier_sklearn decisiontreeclassifier-程序员宅基地

文章浏览阅读4k次,点赞2次,收藏22次。sklearn中决策树算法参数共有13个,如下:classsklearn.tree.DecisionTreeClassifier(criterion=’gini’,splitter=’best’,max_depth=None,min_samples_split=2,min_samples_leaf=1,min_weight_fraction_leaf=0.0,max_featur..._sklearn decisiontreeclassifier

微信小程序+vant报错:[Component] slot ““ is not found._[component] slot "" is not found.-程序员宅基地

文章浏览阅读9.5k次。报错图示:报错代码:报错结果: wx:if去控制van-popup这个弹出层的打开没有反应,弹出层没有打开。报错原因:原生微信小程序引入vant组件库,vant组件不支持原生微信小程序的插槽 (slot),此时就会报错,组件无法渲染。如何解决: 如果单个使用vant组件,例如我图示用的vant-popup,只需要使用show属性去控制弹出层的显示隐藏。如果一个页面使用多个vant-popuup,可以给show另外一个变量去控制隐..._[component] slot "" is not found.

CTF万里追踪——图片里的秘密-程序员宅基地

文章浏览阅读3.2k次。题目如上图所示,用Stegsolve无法找到密文,才开始学,我太弱了,,,,,,, 在网上看到的大神分析如下,捂脸,,, 这里写链接内容 即用fireworks打开,拖动图片找到内嵌的txt文字。 特别注意最后提交答案的时候,要复制这个图片 ,而不是打出这个字符串

随便推点

python读取视频帧_python读取视频流提取视频帧的两种方法-程序员宅基地

文章浏览阅读561次。python读取视频流提取视频帧的两种方法来源:中文源码网 浏览: 次 日期:2018年9月2日【下载文档: python读取视频流提取视频帧的两种方法.txt 】(友情提示:右键点上行txt文档名->目标另存为)python读取视频流提取视频帧的两种方法 本文实例为大家分享了python读取视频流提取视频帧的具体代码,供大家参考,具体内容如下方法一:通过ima..._python读取ts视频帧

vc6.0创建文件时,出现很多烫烫烫解决方法- Unhandled exception in NDW.exe: 0xC0000005: Access Violation._vc6.0 烫烫-程序员宅基地

文章浏览阅读1.1k次。haiuiSWM2烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫.IA如果项目文件放在桌面上如:C:\Documents and Settings\txwtech\桌面\aps001\SWM200-14004-20180717或者项目的路径文件夹包含有中文,就会出现烫烫烫。确保项目路径无中文即可解决问题。文件夹只能包含字母与数字,“-”横杠的符号也不行。不然创建文件最后还出现这个..._vc6.0 烫烫

MFC的对话框中使用OpenGL绘图_mfc dialog使用opengl-程序员宅基地

文章浏览阅读1.4k次,点赞3次,收藏11次。我们在编写软件是总是会有自己的界面,当然利用C++就不得不和MFC打交道了,那么可视化界面通常就要用MFC的Dialog;OpenGL通常画图时会自己生成一个窗口,就如同OpenCV一样,但现在我想OpenGL把图画在对话框指定的位置上,列如,我想在以下对话框的左侧部分显示我要画的图,该怎么做呢?1、首先当然要设置好OpenGL的编程环境;2、新建一个基于对话框的工程,我选择VS studio平台;3、选着Project->add->class,添加一个新类,取名为..._mfc dialog使用opengl

Python爬虫基础笔记(一)-Requests_python第1关:requests 基础-程序员宅基地

文章浏览阅读397次。Python-Requests学习笔记_python第1关:requests 基础

数据结构---串的朴素模式匹配算法_写出朴素的串模式匹配算法index-程序员宅基地

文章浏览阅读333次。导言数据结构中的串就是我们常说的字符串,当我们需要在一个长字符串中寻找目标字符串的时候就需要一种算法来进行定位目标字符串,下面记录一个目标字符串匹配算法----朴素模式匹配算法待匹配的字符串-----被匹配字符串需要寻找的子串-----匹配字符串/目标字符串#include <iostream>#include <string>using namespace std;//朴素匹配算法int naive_match(const string& origial__写出朴素的串模式匹配算法index

Cage验证码生成器快速上手_cage码-程序员宅基地

文章浏览阅读1.3k次。Cage小巧,好用。这里在官方基础例子基础上做了扩展:123456789101112131415161718192021222324252627_cage码