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头信息,

当状态码为301302时(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头有关。浏览器首先会判断状态码,只有当状态码是:301302时,才会根据Location头中的URL进行跳转。

所以,使用location()设置头信息,而不设置状态码或状态码不是301302,并不会发生重定向:

res.location('http://itbilu.com');
res.sent(200);

而使用redirect()设置的状态码不是301302也不会发生跳转:

res.redirect(200, 'http://itbilu.com');

 

 

 

 

参考:https://www.jb51.net/article/110624.htm

转载于:https://www.cnblogs.com/xiaofenguo/p/11504934.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这段 Node.js 代码使用了 res.render 方法来渲染名为 "home.html" 的模板文件,并将一个对象作为第二个参数传递给模板。这个对象包含一个键值对,其中键为 "username",值为 req.session.username,即当前用户的用户名。在模板中,可以通过 {{username}} 来获取这个值并进行展示。 ### 回答2: 这段Node.js代码的作用是将一个名为"home.html"的视图文件渲染并发送给客户端,并同时向视图文件传递了一个对象{username: req.session.username}作为参数。 首先,Node.js平台是一种基于事件驱动和非阻塞I/O模型的服务器端JavaScript运行环境。它允许我们使用JavaScript编写服务器端应用程序,包括处理HTTP请求和响应等功能。 在这段代码中,我们可以看到res.render()方法的使用。这个方法是Express框架中用于渲染视图文件并发送给客户端的方法。它需要两个参数,第一个参数是要渲染的视图文件的路径或文件名,第二个参数是一个对象,存储了要传递给视图文件的数据或变量。 具体到这段代码的示例,"home.html"是要渲染的视图文件的路径或文件名。它可能是一个HTML文件,其中包含了页面的布局、样式和结构等内容。 而第二个参数{username: req.session.username}是一个对象,它包含了一个名为"username"的属性,属性的值为req.session.username。这里的req.session.username是从另外一个地方(可能是通过用户登录或其他逻辑设置的)传递过来的数据。这个对象会被传递给视图文件,在视图文件中可以通过对应的属性名来获取和使用这些数据。 总而言之,这段代码的作用是将名为"home.html"的视图文件渲染并发送给客户端,同时传递了一个包含了用户名信息的对象给视图文件,以便在视图文件中动态显示该用户名。 ### 回答3: 这段Node.js代码的作用是渲染名为"home.html"的模板,并将一个对象作为参数传递给模板。该对象包含一个键值对,键为"username",值为"req.session.username"的值。 res.render()是一个Express框架中的方法,用于渲染模板。它接受两个参数,第一个参数是要渲染的模板文件名,可以是一个相对路径或者是一个在设定的模板文件夹中的文件名。第二个参数是一个对象,用于向模板传递数据。 在这个例子中,"home.html"模板将被渲染,并且可以在模板中通过"{{ username }}"来访问"req.session.username"的值。"req.session.username"是从请求对象(req)的session属性中获取的,而这个session属性可能是在用户登录成功后设置的。 换句话说,这段代码的目的是将"home.html"模板渲染并展示给用户,同时将当前用户的用户名(req.session.username)传递给模板,以便在模板中展示用户的个性化信息。这样,模板就可以根据用户的信息生成动态的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值