这个问题的后续内容。
在我的应用程序中,我有一个任务模型。多个页面可以链接到单个任务的“编辑”网址。例如,/tasks/1/edit
链接到 from/tasks/1
和user/1/
(用户是另一个模型)。
在我的控制器中,我希望能够在通过“更新”操作提交“编辑”后重定向回任何一个引用页面。例如,如果我去/tasks/1/edit
from user/1/
,在“更新”操作之后我想重定向回user/1/
. 如果我去/tasks/1/edit
from ,同样的交易/tasks/1
。
在我的 GET“编辑”操作中,我正在做:
@task = Task.find(params[:id])
if request.referer and (request.referer == task_url(@task) or request.referer == user_url(@task.user))
session[:return_to] = request.referer
else
session.delete(:return_to)
end
在相应的 PUT“更新”操作中,我执行以下操作:
@task = Task.find(params[:id])
respond_to do |format|
if @task.update_attributes(params[:task])
format.html { redirect_to session.has_key?(:return_to) ? session[:return_to] : @task #return to task if no return_to specified
else
...
end
end
这可行,但我担心客户端可能会session[:return_to]
在“更新”中欺骗/伪造他们,从而允许他们重定向到他们想要的任何页面。
这有关系吗?这是一个有效的担忧吗?我需要session[:return_to]
在“更新”中验证吗?