NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红
上一篇文章中,我们已经建立了一个有缓冲机制的文件服务器,能给客户端响应附件类型的文件,其实,就爱莲(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)系列文章------------------------------------------
NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红的更多相关文章
- NodeJS——大汇总(一)(只需要使用这些东西,就能处理80%以上业务需求,全网最全node解决方案,吐血整理)
一.前言 本文目标 本文是博主总结了之前的自己在做的很多个项目的一些知识点,当然我在这里不会过多的讲解业务的流程,而是建立一个小demon,旨在帮助大家去更加高效 更加便捷的生成自己的node后台接口 ...
- NodeJS文件读取:感恩常在--抓把糖果,愉悦客人
通过上一篇文章“NodeJS服务器:一行代码 = 一个的HTTP服务器”,我们已经开启了NodeJS之旅,开发了一个监听在8000端口的HTTP服务器,虽然功能很简单,但是,已经让我们感受到用Node ...
- 遇见NodeJS:JavaScript的贵人
在大家的印象中,相当长一段时间里,JavaScript是一门脚本语言,一般不能成为某个项目的担纲主角,作用只是在浏览器里帮忙校验校验输入是不是正确,响应一下鼠标.键盘事件,或者让某个HTML元素动起来 ...
- NodeJS服务器:一行代码 = 一个的HTTP服务器
从这一篇开始,我们进入技术讲解的话题,逐步实现用NodeJS实现文件的传送共享服务. 前文我们讲过,NodeJS是最擅长做网络服务器的,今天我们就来用NodeJS做一个最简单的服务器. 先看一幅图: ...
- NodeJS缓存机制:畅销货,就多囤一点呗
上一篇文章,我们已经实现了客户端向NodeJS服务器发出请求时,服务器从磁盘读取文件内容后,向客户端返回文件的数据.而对于爱莲(iLinkIT)的1对n的场景,即将文件共享出来之后,让多个用户同时下载 ...
- NodeJS服务器退出:完成任务,优雅退出
上一篇文章,我们通过一个简单的例子,学习了NodeJS中对客户端的请求(request)对象的解析和处理,整个文件共享的功能已经完成.但是,纵观整个过程,还有两个地方明显需要改进: 首先,不能共享完毕 ...
- 爱莲(iLinkIT)的架构与原理
随着移动互联网时代的到来,手机正在逐步替代其他的设备,手机是电话.手机是即时通讯,手机是相机,手机是导航仪,手机是钱包,手机是音乐播放器……. 除此之外,手机还是一个大大的U盘,曾几何时,我们用一根长 ...
- NodeJS异常处理uncaughtException篇
很多 NodeJS 的开发者在抱怨异常处理太麻烦,我们会通过一些列博客梳理一下NodeJS中常见的异常处理的手段. 和大多数编程语言一样,在 NodeJS 里可以通过throw抛出一个异常: thro ...
- Nodejs经验谈
前言 这里主要说一下之前使用Nodejs开发踩过的坑,只说坑不填坑,那就是赤裸地耍流氓,文中有大量的说明及填坑方法,了解的看官可以直接跳过. PS:说实话,Nodejs的坑确实蛮多的:但是上手简单,扩 ...
随机推荐
- 赋值容器winform 根据NAME查找控件
每日一贴,今天的内容关键字为赋值容器 foreach (Control c in this.panel1.Controls) { if (c is TextBox && c.Name ...
- Intel大坑之中的一个:丢失的SSE2 128bit/64bit 位移指令,马航MH370??
缘由 近期在写一些字符串函数的优化,兴趣使然.但是写的过程中,想要实现 SSE2 128 bit / 64 bit 的按 bit 逻辑位移.遇到了一个大坑,且听我娓娓道来. 我并不想用什么马航370来 ...
- Redis命令小细节
1. set setnx setex set 将字符串 value的值关联到key ,假设key已经存在,那么覆盖原来的,假设不存在.那么就创建 setnx 将key的值设置为value ...
- 【转】Linux下(C/C++)使用system()函数一定要谨慎
转自:http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用 ...
- JavaScript与Flash的通信
当Flash置于HTML容器中时,经常会遇到AS与JS的通信问题,例如:JS能否调用AS中的变量.方法,AS能否调用JS中的变量.方法等等.答案是肯定的.随着技术的不断发展,解决方案也是多种多样的. ...
- 【剑指offer】八皇后问题
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26614999 剑指offer上解决八皇后问题,没实用传统的递归或非递归回溯法,而是用了非常 ...
- Java_spark简单例子
import org.apache.spark.{SparkContext, SparkConf} /** * Created by spark on 15-1-19. * 根据key对K-V类型的R ...
- zh-cn,zh-tw,en-us,en-gb等网页语言代码一览表
zh-cn 简体中文zh-tw 繁体中文da-dk 丹麦语nl-nl 荷兰语en-us 英语fi-fi 芬兰语fr-fr 法语de-de 德语it-it 意大利语j ...
- cocos2d-x lua 调用onEnter和onExit
cocos2d-x lua 调用onEnter和onExit version: cocos2d-x 3.6 onEnter和onExit在lua中不会因节点别add和remove而直接被调用,当子节点 ...
- javaScript入门1--组成,基本使用
javaScript:脚本语言,最初是为了实现在客户端进行的表单验证以减少服务器的数据交互次数,如今可用在页面交互,计算,拥有了闭包,匿名(拉姆达)函数,甚至元编程等特性. javaScript实现的 ...