express url跳转(重定向)的实现:res.location() res.redirect()
Express 是一个基于Node.js 实现的web框架,其响应HTTP请求的response对象中有两个响应url跳转方法res.location() res.redirect(),可以实现301 302重定向
1 res.location()
2 re.redirect()
res.location(path)
设置响应的HTTP Location头,path可以是一下几种设置形式:
res.location('/foo/bar')
res.location('../foo');
res.location('http://baidu.com')
res.location('back')
path参数可以是一个绝对路径 相对路径 标准的url或是’back‘.当path是’back‘时,响应的location头会被设置为当前请求的referer头,当referer头不存在时会被设置为’/‘
Express通过Location头将指定的URL字符串传递给浏览器,它并不会对指定的字符串进行验证(除了’back‘外)。而浏览器则负责将当前的url重定义到响应头location中指定的url;
res.redirect([status,]path)
status:{number}表示要设置的HTTP状态码
path:{string}要设置到location头中的URL
重定义到path所指定的URL,重定向时可以同时指定HTTP状态码,不指定状态码默认是302
与location相比,redirect除了要设置path外,还可以指定一个状态码,而path参数则于location完全相同,
使用redirect()重定向时,可以是几下几种设置方式:
res.redirect('/foo/bar');
res.redirect('http://itbilu.com');
res.redirect(301, 'http://itbilu.com');
res.redirect('http://itbilu.com', 301);
res.redirect('../login'); // /blog/post/1 -> /blog/login
res.redirect('back');
url重定向原理
进行url重定向时,服务器只在响应信息的http信息中设置http状态码和location头信息,
当状态码为301或302时(301-永久重定向、302-临时重定向),表示资源位置发生了改变,需要进行重定向。
Location头信息表示了资源的改变的位置,即:要跳重定向的URL。
location与redirect的比较
Express的response对象,时对Node.js原生对象ServerResponse的扩展,location方法只会设置location头,而redirect() 除了
可以设置location头外还可以手动或者自动设置HTTP状态码,理论上讲两者都可以实现重定向。
location()方法
location()方法实现过程大致如下:
res.location = function(url){
var req = this.req;
// "back" 是 referrer的别名
if ('back' == url) url = req.get('Referrer') || '/';
// 设置Lcation
this.setHeader('Location', url);
return this;
};
从以上代码可以看出,location()方法本质上是调用了ServerResponse对象的setHeader()方法,但并没有设置状态码。通过location()设置头信息后,其后的代码还会执行。
使用location()方法实现URL的重定向,还要手动设置HTTP状态码:
res.location('http://itbilu.com');
res.statusCode = 301;
如果需要立即返回响应信息,还要调用end()方法:
res.location('http://itbilu.com');
res.statusCode = 301;
res.end('响应的内容');
// 或
res.location('http://itbilu.com');
res.sent(302);
redirect()方法
redirect()方法实现过程大致如下:
res.redirect = function(url){
var head = 'HEAD' == this.req.method;
var status = 302;
var body;
// 一些处理
……
// 通过 location 方法设置头信息
this.location(url);
// 另一些处理
……
// 设置状态并返回响应
this.statusCode = status;
this.set('Content-Length', Buffer.byteLength(body));
this.end(head ? null : body);
};
从以上代码可以看出,redirect()方法是对location()方法的扩展。通过location()设置Loction头后,设置HTTP状态码,最后通过ServerResponse对象的end()方法返回响应信息。调用redirect()方法后,其后的代码都不会被执行。
3.3 重定向与不重定向
在使用的过程中,redirect()方法大多能重定向成功,而location()方法则不太确定,有时可以成功有时不能成功。这与我们的用法有关。
上面讲过,URL重定向是在浏览器端完成的,而URL重定向与HTTP状态码和Location头有关。浏览器首先会判断状态码,只有当状态码是:301或302时,才会根据Location头中的URL进行跳转。
所以,使用location()设置头信息,而不设置状态码或状态码不是301或302,并不会发生重定向:
res.location('http://itbilu.com');
res.sent(200);
而使用redirect()设置的状态码不是301或302也不会发生跳转:
res.redirect(200, 'http://itbilu.com');
参考:https://www.jb51.net/article/110624.htm
express url跳转(重定向)的实现:res.location() res.redirect()的更多相关文章
- Express URL跳转(重定向)的实现
Express URL跳转(重定向)的实现 Express是一个基于Node.js实现的Web框架,其响应HTTP请求的response对象中有两个用于URL跳转方法res.location()和 ...
- URL跳转与webview安全浅谈
URL跳转与webview安全浅谈 我博客的两篇文章拼接在一起所以可能看起来有些乱 起因 在一次测试中我用burpsuite搜索了关键词url找到了某处url我测试了一下发现waf拦截了指向外域的请求 ...
- HTML meta refresh 刷新与跳转(重定向)页面
下面为各位整理了一些HTML meta refresh 刷新与跳转(重定向)页面的例子吧,后面本站长自己也补充了一些js页面刷新与跳转例子吧. refresh 属性值 -- 刷新与跳转(重定向)页 ...
- 浅谈URL跳转与Webview安全
学习信息安全技术的过程中,用开阔的眼光看待安全问题会得到不同的结论. 在一次测试中我用Burpsuite搜索了关键词url找到了某处url,测试一下发现waf拦截了指向外域的请求,于是开始尝试绕过.第 ...
- nginx rewrite 实现URL跳转
最近工作中常常要改nginx配置,学习了nginx中rewrite的用法 URL跳转这里说的URL跳转就是用户在访问一个URL时将其跳转到另一个URL上.常见的应用场景是让多个域名跳转到同一个URL上 ...
- url跳转漏洞(1)
转载 https://landgrey.me/open-redirect-bypass/ 0x00:漏洞场景 URL跳转漏洞的出现场景还是很杂的,出现漏洞的原因大概有以下5个: 1. 写代码时没有考虑 ...
- 小程序登录方式切换 不做url跳转
var filegUP = require('../../utils/getUserPassword.js'); var filemd5 = require('../../utils/md5.min. ...
- spring mvc controller间跳转 重定向 传参(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- URL跳转漏洞
URL跳转原理: 由于越来越多的需要和其他第三方应用交互,以及在自身应用内部根据不同的逻辑将用户引向到不同的页面,譬如一个典型的登录接口就经常需要在认证成功之后将用户引导到登录之前的页面,整个过程中如 ...
随机推荐
- spark yarn 提交作业
spark提交作业命令: ./spark-submit --master yarn --deploy-mode cluster --class com.zjlantone.hive.SparkOper ...
- YAML_18 ansible 判断和循环
标准循环 模式一 - name: add several users user: name={{ item }} state=present groups=wheel with_items: - te ...
- learning java AWT 手绘窗口
import java.awt.*;port java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import jav ...
- EL运算符和基本运算
1.EL存取器:.和[] ${applicationScope.list[].name} 获取applicationScope中list集合的第二个元素的name属性. 2.三元运算符: ${> ...
- shell脚本之 operater.sh 算术运算符;比较运算符;布尔运算符;逻辑与或非运算符;字符串运算符的使用
1.注意 格式不能变 尤其是变量和变量表达式之间的空格:[ 空格] .[ $a == $b ] 中间的空格严格不能变:否则报错 关系运算符 关系运算符只支持数字,不支持字符串,除非字符串的值是数字. ...
- 35、sparkSQL及DataFrame
一.saprkSQL背景 Spark 1.0版本开始,推出了Spark SQL.其实最早使用的,都是Hadoop自己的Hive查询引擎:但是后来Spark提供了Shark:再后来Shark被淘汰,推出 ...
- 洛谷P1199三国游戏
题目 博弈论+贪心. 由于我们是先手,所以我们其实是必赢的,而且其实选完前两次,就已经结束了,因为接下来选的每一次其实都没有我们前几次选的好.而且又因为机器人会把我们想选的最好的拿走,那我们就只能拿走 ...
- 利用Unicode RTLO方法构建恶意文件名
一:简介 RTLO"字符全名为"RIGHT-TO-LEFTOVERRIDE",是一个不可显示的控制类字符,其本质是unicode 字符."RTLO"字 ...
- 深入理解volatile原理与使用
volatile:称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的. 可见:一个线程修改了这个变量的值,在另一个线程中能够读取到这个修改后的值. synchronized除了线程之间互 ...
- python3+requests get/post 请求
1.get请求 (1)没有请求参数类型 1 response = requests.get(url='') 2 print(response.text) (2)有请求参数的类型(键值对形式表示参数) ...