`
jbf034
  • 浏览: 152312 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

应答3-重定向(redirect_to)

阅读更多
一个HTTP redirect 被从服务端发送给客户端,以应答一个请求。它会说,“我不能处
理这个请求,但这儿有些人能处理”。Redirect 应答包括一个URL,它是客户端应该试着下
次发送同样的状态信息给这个redirect,而不管它是持久的(状态码301)还是临时的(状态码
307)。有时,当web 页面被重新改编时,redirect 会被使用;访问旧位置页面的客户端将被
引到页面的新位置。
Redirect 背后由web 浏览器进行处理。通常,你只知道重定向稍微有些延迟,并且你看
到的页面的URL 将被从你的请求修改。最后一点很重要—直到浏览器关注它,来自于服务端
的redirect 动作与最终你手工地输入目的URL 是一样的。
当写well-behaved Web 应用程序时,关掉redirect 是很重要的。
让我们看个简单的博客应用程序,它支持评论,我们的应用程序应该重新显示文章,新
的评论在尾部。下面是代码。
class BlogController
def display
@article = Article.find(params[:id])
end
def add_comment
@article = Article.find(params[:id])
comment = Comment.new(params[:comment])
@article.comments << comment
if @article.save
flash[:note] = "Thank you for your valuable comment"
else
flash[:note] = "We threw your worthless comment away"
end
# DON'T DO THIS
render(:action => 'display')
end
end
这儿很明显故意地在一个评论之后显示文章。要做到这点,开始在add_comment()方法
结束时调用render(:action=>’display’)。这会提交显示“视图”,显示最终用户更新的
文章。但从浏览器角度想想。它发送了一个尾部为blog/add_comment 的URL,并且取回了索
引列表。直到浏览器被连接,当前URL 的尾部还是blog/add_comment。这意味着如果用户点
击刷新(或许是想看看否有其它人的评论),add_commandt URL 将被再次发送给应用程序。用
户的目的是刷新显示,但应用程序看到了一个被添加到其它comment 上的请求。
在这些情况下,正确的方式是在index 列表中显示添加的评论,并将其重定向给浏览器
的display“动作”。我使用Rails 的redirect_to()方法来做。如果用户随后刷新浏览器,
它会简单地调用display“动作”,并不会添加其它的评论。
def add_comment
@article = Article.find(params[:id])
comment = Comment.new(params[:comment])
@article.comments << comment
if @article.save
flash[:note] = "Thank you for your valuable comment"
else
flash[:note] = "We threw your worthless comment away"
end
redirect_to(:action => 'display')
end
Rails 也有一个简单但强大的重定向机制。它可以重定向到给出的“控制器”(传递参数)
内的“动作”,或重定向到当前服务端的一个URL,或重定向到一个任意的URL,让我们依次
看看这三种形式。
1、redirect_to 重定向一个“动作”
redirect_to(options...) 基于选项哈希表内的值发关一个临时重定向给浏览器。目标
URL 使用url_for()生成,所以redirect_to()格式有Rails“路由器”代码在背后支持。可
查阅280 页16.3 节。
2、redirect_to 重定向到应用程序内的一个固定路径。
redirect_to(path) 重定向到给出的路径。用前导“/”开头的路径,相对于协议,主机,
当前请求的端口。这个方法不会URL 上完成任何的重写工作,所以它不应该被用于创建,期
望连接到应用程序内一个“动作”的路径。
def save
order = Order.new(params[:order])
if order.save
redirect_to :action => "display"
else
session[:error_count] ||= 0
session[:error_count] += 1
if session[:error_count] < 4
flash[:notice] = "Please try again"
else
# Give up -- user is clearly struggling
redirect_to("/help/order_entry.html")
end
end
end
3、redirect_to 重定向到一个有绝对路径的URL。
redirect_to(url) 重定向到一个给定的完整的URL,它必须用一个协议名字来开头(如
http://)。
def portal_link
link = Links.find(params[:id])
redirect_to(link.url)
end
缺省情况下,所有重定向都是临时性的(它们只影响到当前请求)。当重定向一个URL 时,
你或许是想得到永续的重定向。在这种情况下,设置“应答头”内的状态。
headers["Status"] = "301 Moved Permanently"
redirect_to("http://my.new.home")
因为重定向方法发送应答给浏览器,同样的规则也适用于提交方法—你可发一个请求。
分享到:
评论

相关推荐

    sofia-sip_sourceforge

    4. 重定向服务器(Redirect Server):返回一个或多个新的URI,指引呼叫者向其他位置发起呼叫。 在sofia-sip库中,开发者可以使用以下核心功能: 1. 呼叫建立与管理:通过创建和发送INVITE请求,以及处理接收到的...

    网管教程:从入门到精通(软件篇)

    - `/redirect [PortBaudRate] | [useBiosSettings]`: 在启动引导程序中通过指定配置启用重定向。 2. **Chkdsk** - **用法**: `chkdsk [drive:] [/p] [/r]` - **参数**: - `drive:`: 指定要检查的驱动器。 - ...

    icmp_type and code.docx

    - **Code 3**: Redirect for TOS and Host - 对服务类型和主机重定向。 ##### 5. 生存时间过期 - **Type 11**: Time Exceeded - 生存时间过期,包括: - **Code 0**: TTL Equals 0 During Transit - 传输期间...

    SIP 培训资料

    - **Redirect Server**:重定向服务器,用于向客户端提供另一个地址来尝试请求。 - **Dialog**:会话,由一系列交互构成的逻辑单位。 - **Transaction**:事务,由一个请求及其相关的响应组成的基本通信单元。 - **...

    SIP 即时消息RFC3428

    - **8.1.3.4 处理3xx应答** - **8.1.3.5 处理4xx应答** - **8.2 UAS特性** - **8.2.1 方法判定** - **8.2.2 包头判断** - **8.2.2.1 TO和Request-URI** - **8.2.2.2 合并的请求** - **8.2.2.3 Require** - ...

    sipRFC3261-cn.pdf

    3. **重定向服务器(Redirect Servers)**:提供目标位置信息,使客户端能够重新发起请求。 4. **注册服务器(Registrar Servers)**:存储用户注册信息,以便后续查找。 #### 五、协议结构 SIP消息结构主要包括两...

    ICMP TYPE CODE 对应表.docx

    Code:0-3 Description:重定向 Redirect 是一种 ICMP 报文类型,用于通知发送方改变路由,以提高网络性能。该报文类型包括多种代码,分别对应不同的重定向原因。 * Code 0:Redirect for network——对网络重定向...

    eudemon01-命令手册-入门

    - **语法格式**: `redirect { enable | disable }` - **示例**: `redirect enable` - **说明**: 启用或禁用用户界面的重定向功能。 - **1.2.16 screen-length** - **功能**: 设置屏幕长度。 - **语法格式**: `...

    icmp报文类型说明

    4. **重定向(Redirect,类型5)**: - 用于告知发送主机有更优路径到达目的地。 5. **回应请求(Echo Request,类型8)**: - 常用于ping命令,测试主机之间的连通性。 6. **超时(Time Exceeded,类型11)**:...

    ICMP报文的格式和种类

    * 类型 5、代码 0:重定向(REDIRECT)。 ICMP 报文的应用 ICMP 报文广泛应用于网络诊断和 debug 中,例如: 1. ping 命令:使用 ICMP 响应请求(ECHO-REQUEST)和响应应答(ECHO-REPLY)报文来测试网络连接性。 ...

    Squid中文权威指南

    16.1.1 "Failed to make swap directory" 16.1.2 "Address already in use" 16.1.3 "Could not determine fully qualified hostname" 16.1.4 "DNS name lookup tests failed" 16.1.5 "Illegal character ...

    就业指导课 -自己的理解 - 副本.doc

    - 重定向(Redirect):客户端收到服务器的302状态码后,发起新的请求,地址栏会显示新的URL,数据无法共享,适合访问外部应用。 - 转发(Forward):服务器内部将请求转发到其他资源,客户端只发出一次请求,地址...

    RFC3261(SIP协议)中文文字版(带目录)

    - **Redirect Server**:重定向服务器,告知UAC如何联系目标用户。 - **Register Server**:注册服务器,用于维护用户的位置信息。 #### 4、实施概览 SIP协议的实现通常涉及以下组件: - **用户代理**:分为UAC和...

Global site tag (gtag.js) - Google Analytics