最近作的一个主管安排的项目,给一个系统多增长一套前端模板,这个自己不难,因为算法那边不能提供数据,我随便复制的网上图片连接,发现有些图片不能正常显示,后来知道有些图片加了“防盗链”,这让我立刻想到了之前遇到的http请求头中的referer属性,这个消息头记录了本网站的一些资源请求是来自哪一个网站,若是利用这个referer的判断,就能够实现过滤。html
代码:前端
var express = require('express'); var app = express(); var fs = require('fs'); // 设置模板路径,默认为./views // app.set('views', path.join('views')); app.engine('html', require('ejs').renderFile); app.set('view engine', 'html'); app.get('/public/*', function (req, res, next) { var referer = req.headers.referer; console.log(referer); if (referer && referer.indexOf('localhost1') <= 0) { try { fs.readFile("./views/no.png", function (err, data) { console.log("no"); res.writeHead(200, {"Content-type": "image/jpg"}); console.log(err); // console.log(data); res.end(data); }); } catch (err) { console.log(err); } } else { try { fs.readFile("./views/a.jpg", function (err, data) { console.log("normal"); res.writeHead(200, {"Content-type": "image/jpg"}); // console.log(data); res.end(data); }); } catch (err) { console.log(err); } } }); app.get('/', function (req, res) { res.render('index', {helloWorld: 'hello,world'}); }); app.listen(3000, function () { console.log('app listen at 3000'); });
referer是一个网站中某个资源的请求才会带的属性,若是是直接访问图片的这个地址,是不带referer的,因此
这里判断的时候,先要判断referer存在,再判断是否是从某域发过来的请求,由于咱们直接访问地址的时候是想看到图片结果的,只是一些网站引用咱们的图片连接时咱们加以屏蔽。算法
还能够以中间件的形式:express
var express = require('express'); var app = express(); var fs = require('fs'); // 设置模板路径,默认为./views // app.set('views', path.join('views')); app.engine('html', require('ejs').renderFile); app.set('view engine', 'html'); function sss (req, res, next) { var referer = req.headers.referer; console.log(referer); // console.log(referer.indexOf('localhost3')); if (referer && referer.indexOf('localhost1') >= 0) { next(); } else { // console.log(res); console.log(1); // res.state(500).send('盗链图片来自:<a href="xxxxx"></a>'); res.send('盗链图片来自:<a href="xxxxx"></a>'); return false; } } app.get('/public/*', sss, function (req,res,next) { console.log(234234); try { fs.readFile("./views/a.jpg", function (err, data) { res.writeHead(200, {"Content-type": "image/jpg"}); console.log(err); // console.log(data); res.end(data); }); }catch (err) { console.log(err); } }); app.get('/', function(req, res) { console.log(10); res.render('index', { helloWorld: 'hello,world' }); }); app.listen(3000, function() { console.log('app listen at 3000'); });
固然破解这种写法的防盗链也很简单,用中间服务器伪造消息头就好了。服务器