上一篇文章中,我们已经建立了一个有缓冲机制的文件服务器,能给客户端响应附件类型的文件,其实,就爱莲(iLinkIT)而言,NodeJS的模块做到这样也就已经可以了,因为使用的场景就是电脑和手机之间,与部署在Internet上的服务器相比,安全性的要求是不高的。但是,我们这一系列文章的主要目的是学习,整到现在,我们只讲了服务器对客户端的响应,调用了response对象,但是对于客户端提交上来的请求(request对象),没有怎么关注过。本文就给服务器增加一点安全特性,服务器仅仅对特定的请求才响应,返回共享的文件。如爱莲(iLinkIT)的最终效果一样,只有扫描指定的二维码,才能实现文件的下载。

老规矩,先上一给图:

现在我们就来实现这样的功能,当服务器发现客户端的请求url是:http://localhost:8000/xiaohong时,就给客户端响应共享的文件,其他的请求任务,则给客户端反馈 Hello, iLinkIT。

代码如下:

 var http = require( 'http' );
var fs = require('fs');
var url = require( 'url' ); var file_path = "D:\\ilinkit_logo.png" ;
var file_stream ;
var buffer_box = [] ;
var file_length = 0 ; var file_name = file_path.substr( file_path.lastIndexOf('\\')+1 ); fs.stat( file_path , function ( err , stat ){
if (err) {
if ('ENOENT' == err.code) {
console.log( 'File does not exist...' );
} else {
console.log( 'Read file exception...' );
}
} else {
file_stream = fs.createReadStream( file_path );
file_stream.on( 'data' , function( chunk ){
buffer_box.push( chunk ) ;
file_length += chunk.length ;
} );
file_stream.on( 'end' , function( ){
console.log( "文件读取完毕" );
} );
file_stream.on('error', function(err){
console.log( "文件读取失败!" );
}); var server =http.createServer( function ( request ,response ){
var h_path = url.parse( request.url ).pathname ;
if( h_path === '/xiaohong' ){
response.setHeader( 'Content-Type' , 'application/octet-stream' );
response.setHeader( 'Content-Disposition' , 'attachment; filename=' + encodeURIComponent(file_name) ); for( var buffer_index = 0 ; buffer_index<buffer_box.length ; buffer_index++ )
{
response.write( buffer_box[buffer_index] );
}
response.end();
}
else{
response.end( 'Hello, iLinkIT' );
} } );
server.listen( 8000 );
console.log( 'HTTP服务器启动中,端口:8000.....' ); }//end else,读取文件没有发生错误
});

关键代码解析如下:

第3行,因为我们要解析客户端的请求,所以,需要加载url模块。

第33行,通过url.parse,解析出request对象中的请求路径部分。

第34行~第46行,整体逻辑是,如果第33行解析出的路径部分内容是“/xiaohong”,则给客户端响应指定的文件,如果不是“/xiaohong”,就打一个招呼,响应'Hello, iLinkIT'。

验证方式如下:

1. 启动服务器:打开命令行,进入js脚本所在的位置,执行:node g_ilinkit_1.js

2. 打开浏览器,输入:http://localhost:8000,显示如下:

因为请求的路径不是/xiaohong,所以显示的是Hello,iLinkIT的内容。

3. 打开浏览器,输入:http://localhost:8000/xiaohong,服务器反馈一个共享的文件附件,如下图所示。

今天的文章比较简单,就简单回顾一下:

在HTTP服务器的响应函数中,从request对象中可以获得客户端请求的主机名称、端口号以及请求路径等等信息,而核心模块url则提供了多种方法来解析请求中的url。

在爱莲(iLinkIT)真实的实现中,是会生成一个时间戳作为代码,服务器根据传入的时间戳参数决定如何响应,同时根据时间戳生成一个url地址的二维码。

request对象是一个非常重要的对象,我们知道,在Web服务器中,请求的URL路径不同,服务器的响应也不同,这个是Web服务器的基本框架。如果用NodeJS搭建Web服务器,也是同样的道理,不过,托NodeJS社区的洪福,现在已经有很多现成的框架可以选用,比如:express 框架。在express框架中,基本的思路就是服务器根据request的url地址,根据设定的‘路由规则’来调用请求的处理模块,‘路由规则’和我们在Java Servlet中将一个url模式映射给一个servlet处理类似。而对客户端的响应中,服务器采用了“模板+数据”的方式,即根据业务诉求,从后台(例如:数据库)取得数据之后,填充到模板中,然后将页面反馈给客户端。当然,express框架也实现了如何进行身份识别等功能。如果你整明白了express框架,那么,你会对MVC(数据-视图-控制)架构模式会有更深刻的认识。

本系列文章的主题是围绕爱莲(iLinkIT)来开展的,所以,如果你要用NodeJS搞Web服务器,建议找专门介绍express框架的书看一看。

最后,感谢诸位的捧场,希望能多提宝贵意见,谢谢^_^~~

-----------------------爱莲(iLinkIT)系列文章------------------------------------------

缘起爱莲:我要的,现在就要!

爱莲(iLinkIT)的架构与原理

遇见NodeJS:JavaScript的贵人

NodeJS服务器:一行代码 = 一个的HTTP服务器

NodeJS文件读取:感恩常在--抓把糖果,愉悦客人

NodeJS缓存机制:畅销货,就多囤一点呗

NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红

NodeJS服务器退出:完成任务,优雅退出

NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红的更多相关文章

  1. NodeJS——大汇总(一)(只需要使用这些东西,就能处理80%以上业务需求,全网最全node解决方案,吐血整理)

    一.前言 本文目标 本文是博主总结了之前的自己在做的很多个项目的一些知识点,当然我在这里不会过多的讲解业务的流程,而是建立一个小demon,旨在帮助大家去更加高效 更加便捷的生成自己的node后台接口 ...

  2. NodeJS文件读取:感恩常在--抓把糖果,愉悦客人

    通过上一篇文章“NodeJS服务器:一行代码 = 一个的HTTP服务器”,我们已经开启了NodeJS之旅,开发了一个监听在8000端口的HTTP服务器,虽然功能很简单,但是,已经让我们感受到用Node ...

  3. 遇见NodeJS:JavaScript的贵人

    在大家的印象中,相当长一段时间里,JavaScript是一门脚本语言,一般不能成为某个项目的担纲主角,作用只是在浏览器里帮忙校验校验输入是不是正确,响应一下鼠标.键盘事件,或者让某个HTML元素动起来 ...

  4. NodeJS服务器:一行代码 = 一个的HTTP服务器

    从这一篇开始,我们进入技术讲解的话题,逐步实现用NodeJS实现文件的传送共享服务. 前文我们讲过,NodeJS是最擅长做网络服务器的,今天我们就来用NodeJS做一个最简单的服务器. 先看一幅图: ...

  5. NodeJS缓存机制:畅销货,就多囤一点呗

    上一篇文章,我们已经实现了客户端向NodeJS服务器发出请求时,服务器从磁盘读取文件内容后,向客户端返回文件的数据.而对于爱莲(iLinkIT)的1对n的场景,即将文件共享出来之后,让多个用户同时下载 ...

  6. NodeJS服务器退出:完成任务,优雅退出

    上一篇文章,我们通过一个简单的例子,学习了NodeJS中对客户端的请求(request)对象的解析和处理,整个文件共享的功能已经完成.但是,纵观整个过程,还有两个地方明显需要改进: 首先,不能共享完毕 ...

  7. 爱莲(iLinkIT)的架构与原理

    随着移动互联网时代的到来,手机正在逐步替代其他的设备,手机是电话.手机是即时通讯,手机是相机,手机是导航仪,手机是钱包,手机是音乐播放器……. 除此之外,手机还是一个大大的U盘,曾几何时,我们用一根长 ...

  8. NodeJS异常处理uncaughtException篇

    很多 NodeJS 的开发者在抱怨异常处理太麻烦,我们会通过一些列博客梳理一下NodeJS中常见的异常处理的手段. 和大多数编程语言一样,在 NodeJS 里可以通过throw抛出一个异常: thro ...

  9. Nodejs经验谈

    前言 这里主要说一下之前使用Nodejs开发踩过的坑,只说坑不填坑,那就是赤裸地耍流氓,文中有大量的说明及填坑方法,了解的看官可以直接跳过. PS:说实话,Nodejs的坑确实蛮多的:但是上手简单,扩 ...

随机推荐

  1. J2EE程序员应该要掌握的linux知识

    J2EE程序员应该要掌握的linux知识 大型J2EE应用都在建构在linux环境下的.开发环境下我们可以通过samba映射成本地的网络驱动器,直接在windows环境下进行编程调试.但是最后的发布还 ...

  2. VS里面如何设置环境默认的开发语言

  3. Windows 窗体的.Net 框架绘图技术

    当编写一个典型的Windows 窗体程序时,窗体和控件的绘制.效果等操作是不需要特别加以考虑的.这是为什么呢?因为通过使用 .Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写一些简单的与事件 ...

  4. androidstudio can't run git.exe

    今天用android studio从git下载项目的时候遇到一个问题,提示说can't run git.exe 问了下度娘以及谷歌.但是无果,后面捣鼓了一阵,下了一个git windows版本后,在a ...

  5. delphi Sender和Tag的用法1

    Sender和Tag的用法  在它们共同的OnClick事件下返回单击的那个按钮的标题         unit Unit1;interfaceuses  Winapi.Windows, Winapi ...

  6. string和stringbuilder的解剖

    String和StringBuilder的深入解析   前言:本文出发点是我们开发的过程中是否真正的理解stringbuilder的使用,string字符串操作的是如何实现(哈希表),stringbu ...

  7. 苹果Swift语言中文教程资源汇总

    苹果swift语言中文教程(零)搭配环境以及代码执行成功http://vjiazhi.com/kaifa/1014.html 苹果Swift语言中文教程(一)基础数据类型 http://vjiazhi ...

  8. SHELL 详解

    http://blog.csdn.net/vah101/article/details/6173488 ( a=2;b=4;c=9; ) 子shell 环境 { a=2;b=4;c=9; } 当前sh ...

  9. sql 事务处理

    事务定义: 事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据更改均会 提交,成为数据库中的永久组成部分.如果事务遇到错误且必须取消或回滚,则所有 数据更改均被清除. 事务三种运行模式 ...

  10. 项目源码--Android3D影音播放器源码

      下载源码   技术要点: 1.本地音乐管理 2.音频流的解码 3. UI控件的综合使用 4. 视频流的解码 5. 动态更换皮肤 6. 3D效果的实现 7. 源码带详细的中文注释 ...... 详细 ...