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') || '/';// 设置Lcationthis.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
转载于:https://www.cnblogs.com/xiaofenguo/p/11504934.html
express url跳转(重定向)的实现:res.location() res.redirect()相关推荐
- HTML meta refresh 刷新与跳转(重定向)页面
refresh 属性值 -- 刷新与跳转(重定向)页面 refresh用于刷新与跳转(重定向)页面 refresh出现在http-equiv属性中,使用content属性表示刷新或跳转的开始时间与跳转 ...
- Apache Rewrite伪静态基本及URL跳转
Rewirte主要的功能就是实现URL的跳转,Rewirte代码的正则表达式是基于Perl语言.基于服务器级的(httpd.conf)和目 录级的 (.htaccess)两种方式,而我们Apache一 ...
- spring mvc controller间跳转 重定向 传参
spring mvc controller间跳转 重定向 传参 1. 需求背景 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形 ...
- 网站漏洞检测服务 URL跳转漏洞的检测与修复
网站渗透测试是指在没有获得网站源代码以及服务器的情况下,模拟入侵者的攻击手法对网站进行漏洞检测,以及渗透测试,可以很好的对网站安全进行全面的安全检测,把安全做到最大化.在挖掘网站漏洞的时候我们发现很多 ...
- URL跳转漏洞详解与实战
URL跳转漏洞描述 服务端未对传入的跳转url变量进行检查和控制,可导致恶意用户构造一个恶意地址,诱导用户跳转到恶意网站. 跳转漏洞一般用于钓鱼攻击,通过跳转到恶意网站欺骗用户输入用户名和密码来盗取用 ...
- Web安全-URL跳转与钓鱼
概述 URL跳转事件是比较常见的,比如,登陆网页以后,从登陆页面跳转到另一个页面,这就叫做URL跳转,但是URL跳转怎么和网络钓鱼联系在一起呢?下面将详细介绍URL跳转与钓鱼. URL重定向漏洞也称U ...
- 网络安全学习笔记——域名伪装与URL跳转漏洞
目录 域名伪装基本概念 URL跳转漏洞 漏洞原理 发生场景 实现方式 防护方法 ...
- 【Golang】go中如何在不断加载输出的页面加载完成后进行自动跳转/重定向
有个场景,是页面在不断地使用fmt.Fprintf(w, "something...")进行输出,其中w被定义为w http.ResponseWriter.需求是在输出完成后,页面 ...
- 拦截锚点修改url_浅谈URL跳转与Webview安全
学习信息安全技术的过程中,用开阔的眼光看待安全问题会得到不同的结论. 在一次测试中我用Burpsuite搜索了关键词url找到了某处url,测试一下发现waf拦截了指向外域的请求,于是开始尝试绕过.第 ...
最新文章
- hadoop 2.0 详细配置教程
- SDL 库安装、环境配置与使用
- python3 循环写入一对多键值对_为什么Python 3.6以后字典有序并且效率更高?
- linux '$^t' 时间,Linux C时间函数 time_t struct tm
- Sun为何一掷千金拿下MySQL?
- Selenium-几种操作
- Unreal4有哪些令你印象深刻拍案叫绝的设计
- html 判断当前窗口是否是子窗口,JavaScript window.open 判断子窗口是否已经存在
- java新手笔记7 找最小、最大、排序
- volatile的总结
- 【计算机网络】SIP会话时,使用重定向与不使用重定向功能的区别
- zznuoj 2122
- SEO(搜索引擎优化)
- Blender摄像机环绕运动、动画渲染、视频合成
- nginx的工作原理与nginx的配置
- L1-022 奇偶分家 (10 分) 含解题思路 C语言 位运算
- NVIDIA Jetson Nano主机的autoware的学习与demo运行-第1章-操作环境的搭建
- 美如初见:护肤的真相
- Git for windows 和 cygwin
- ARM全解析 ARM8/ARM7/A9/A15等区别
热门文章
- python自动化常用模块_Python自动化之常用模块
- react循环key值_01 React快速入门(一)——使用循环时对于‘key’报错处理
- js基础代码大全_关于前端业务代码的一些见解
- laravel架构判断id存在与否 存在进行什么操作_基于 Module 的 Laravel API 架构
- c# 找出目录下的所有子目录_C#遍历文件夹,其实只需要一句话!
- java spring 事务提交_Spring 事务提交之后再执行操作
- 《Python预测之美》送书活动,拿走不谢~
- 孙鑫-MFC笔记七--文件与注册表
- python3.8-运行jupyter 报raise NotImplementedError
- vue企业门户网站模板_6 个火爆 GitHub 的后台管理模板,快来收藏!